VStack 中的文本在 SwiftUI 中不应该截断时被截断

Text inside a VStack truncates when it's not supposed to in SwiftUI

我正在尝试在 VStack 中创建一个简单的 Text 堆栈,无论我做什么,文本都会截断而不是换行,即使我明确设置 lineLimit(nil)(虽然我知道这是现在的默认值)。

我试过在 VStack 的第一个元素上设置 layoutPriority(1),我也试过按照其他一些帖子的建议设置 frame(idealHeight: .greatestFiniteMagnitude),但似乎没有什么可以解决这个问题。

以下是实际问题的视频:

下面是一些重现问题的代码:

import SwiftUI

struct BugRepro: View {

    @State var length: Double = 1.0

    var body: some View {
        VStack {
            ForEach(0..<3) { i in
                BugReproElement(index: i)
            }
            .background(Color.gray3)
            .frame(width: UIScreen.main.bounds.width * CGFloat(length))


            Slider(value: $length, in: 0.0...1.0)
        }

    }
}

struct BugRepro_Previews: PreviewProvider {
    static var previews: some View {
        BugRepro()
    }
}

struct BugReproElement: View {
    var index: Int

    var body: some View {
        Text("iaush isuh siudh siudh isudh isudhdsiu sdiuh sdihs")
        .foregroundColor(.gray7)
        .frame(minWidth: 0, maxWidth: .infinity, alignment: .leading)
    }
}

这可能只是 Xcode 中的错误吗?我是 运行 Beta 7

不幸的是这是一个错误。

您可以使用一种解决方法来强制它重新计算元素,但这只是一种解决方法,您必须等待发布并查看它是否已修复。

解决方法

ForEach.

的内容上下添加一对高度为zero的间隔符
struct BugRepro: View {

    @State var length: Double = 1.0

    var body: some View {
        VStack {
            ForEach(0..<3) { i in
                Spacer().frame(height: 0)
                BugReproElement(index: i)
                Spacer().frame(height: 0)
            }.frame(width: UIScreen.main.bounds.width * CGFloat(length))

            Slider(value: self.$length, in: 0.0...1.0)
        }
    }
}

我想出了如何让文本正确呈现。

在此处应用答案有效:

关键是确保 .fixedSize().frame()

之前添加

不需要Spacer()

.fixedSized 必须在 .font() 之前添加才能为我工作。

我必须添加 .fixedSize(horizontal: false, vertical: true) AND .padding() 在我的所有文本停止截断(正确显示在视图中)之前我还有一个框架标签一个单独的 vstack(我在视图中有 2 个单独的 vstack)

Text("Some Text")
    .lineLimit(1)
    .fixedSize()

将始终显示在完整显示的 1 行中。