如何在没有固定宽度的情况下让文本包裹在 UILabel(通过 UIViewRepresentable)中?

all*_*tom 14 uilabel swift swiftui

将 lineBreakMode 设置为 byWordWrapping 并将 numberOfLines 设置为 0 似乎还不够:

struct MyTextView: UIViewRepresentable {
    func makeUIView(context: Context) -> UILabel {
        let label = UILabel()
        label.lineBreakMode = .byWordWrapping
        label.numberOfLines = 0
        label.text = "Here's a lot of text for you to display. It won't fit on the screen."
        return label
    }

    func updateUIView(_ view: UILabel, context: Context) {
    }
}

struct MyTextView_Previews: PreviewProvider {
    static var previews: some View {
        MyTextView()
            .previewLayout(.fixed(width: 300, height: 200))
    }
}
Run Code Online (Sandbox Code Playgroud)

无论我对 lineBreakMode 使用哪种设置,文本都不会换行。画布预览和实时预览都如下所示:

文本未换行的屏幕截图

我得到的最接近的是设置 preferredMaxLayoutWidth,这确实会导致文本换行,但似乎没有一个值表示“无论视图大小如何”。

LuL*_*aGa 16

可能的解决方案是将宽度声明为 MyTextView 上的变量:

struct MyTextView: UIViewRepresentable {

    var width: CGFloat

    func makeUIView(context: Context) -> UILabel {
        let label = UILabel()
        label.lineBreakMode = .byWordWrapping
        label.numberOfLines = 0
        label.preferredMaxLayoutWidth = width
        label.text = "Here's a lot of text for you to display. It won't fit on the screen."
        return label
    }

    func updateUIView(_ view: UILabel, context: Context) {
    }
}
Run Code Online (Sandbox Code Playgroud)

然后使用 GeometryReader 找出有多少可用空间并将其传递给初始化器:

struct ExampleView: View {

    var body: some View {
        GeometryReader { geometry in
            MyTextView(width: geometry.size.width)
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 您好,请记住,当您使用 ScrollView 时,看起来这个解决方案不起作用,只需将 ScrollView 放入 GeometryReader 中,如下所示: `var body: some View { GeometryReader { Geometry in ScrollView { MarkDownText(width:几何.尺寸.宽度,字符串:self.documentationStr).padding([.leading,.bottom,.trailing],10.0).multilineTextAlignment(.leading)} } }` (2认同)

Mic*_*bro 11

Try to use this magic line in makeUIView() func

label.setContentCompressionResistancePriority(.defaultLow, for: .horizontal)
Run Code Online (Sandbox Code Playgroud)

  • 是的,但它是截断线!我已经尝试过,但最后只有一行被截断。 (3认同)
  • 这个和“numberOfLines = 0”就可以了。不需要几何阅读器。 (2认同)