The text doesn't gets wrap in swift UI

Let*_*ate 13 ios swift swiftui

Even After setting the .lineLimit(nil) the text doesn't get a wrap.

var body: some View {
    VStack(alignment: .center) {
        Text("SwiftUI is a modern way to declare user interfaces for any Apple platform. ")
            .font(.title)
            .color(.red)
            .lineLimit(nil)
        Text("Create beautiful, dynamic apps faster than ever before.")
            .font(.system(size: 20))
            .lineLimit(nil)
    }.padding(EdgeInsets(top: 0, leading: 10, bottom: 0, trailing: 10))
}
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明

Sha*_*ero 168

在花了很多时间处理这样的错误之后,我不能 100% 确定这是一个 lineLimit 问题。在撰写本文时,我找到的解决方案更复杂的视图是以下代码片段,以防止包装:

.fixedSize(horizontal: false, vertical: true)

这应该可以防止解释器垂直折叠文本。

我希望这可以帮助别人。

  • 该解决方案在尝试 lineLimit 并删除 Spacer() 后解决了我的问题 (2认同)
  • 但请注意“这可能会导致视图超出父级的边界,这可能是也可能不是您想要的效果。” (2认同)

awo*_*olf 24

从 Xcode 11.3 / Swift 5.1 开始的完整解决方案可在此处的多个答案中找到。

为什么会发生这种情况的解释可以在Matteo Pacini 的答案中找到:使用预定义的.font(.title)、等似乎会带来这些视图将自身大小调整为始终椭圆化而不是换行的.font(.headline)行为。Text然而,简单地切换到.body似乎并不是最好的解决办法。

最好的解决方法可以在Sharpienero 的答案中找到:添加.fixedSize(horizontal: false, vertical: true)到您的Text视图中。这告诉Text视图不要执行其自定义的调整大小水平逻辑(即“不省略”),这会导致它遵循我们都习惯的标准规则。

感谢他们俩!

  • 嘿,谢谢您提供的附加信息。我确实觉得我的答案缺乏,所以这是一个很好的补充答案。再次感谢! (3认同)

Mat*_*ini 6

It looks like the font holds line wrapping attributes.

If you change it to body, then it wraps correctly!

在此处输入图片说明

  • @Let's_Create 没有人确切知道,因为它不是开源的,而且我们真的不知道幕后发生了什么。这只是一个猜测。 (2认同)
  • 是的,我理解您的回复。 (2认同)

Mo *_*ani 5

尝试将第二个“文本” lineLimit更改为数字而不是nil:

VStack(alignment: .leading) {
  Text("SwiftUI is a modern way to declare user interfaces for any Apple platform. ")
    .font(.title)
    .color(.red)
    .lineLimit(nil)
  Text("Create beautiful, dynamic apps faster than ever before.")
    .font(.system(size: 20))
    .lineLimit(2)
 }.padding(EdgeInsets(top: 0, leading: 10, bottom: 0, trailing: 10))
Run Code Online (Sandbox Code Playgroud)

结果:

在此处输入图片说明

  • 我尝试了这个,并将两者都设置为“99999”,但我没有看到任何变化。 (4认同)

Sup*_*tar 5

对于我的问题,我有这样的设置:

public var body: some View {
    Form {
        Text("Lorem ipsum dolor sit amet, consectetur adipiscing elit.")
            .font(.title)

        Spacer()
            .fixedSize()

        Text("""
            Integer ut orci odio. Proin cursus ut elit eget rutrum. Nunc ante sem, euismod sed purus sed, tempus elementum elit. Phasellus lobortis at arcu quis porta. Cras accumsan leo eu tempus molestie. Suspendisse vulputate diam ipsum, et tristique lorem porta et. Pellentesque sodales est id arcu luctus venenatis.

            Vestibulum non magna lorem. In tincidunt aliquet nunc, sit amet pharetra neque hendrerit id.

            Cras sed!
            """)

        NativeButton("OK", keyEquivalent: .return) { self.screen = .game }
    }
        .frame(maxWidth: 480)
        .fixedSize()
        .padding()
}
Run Code Online (Sandbox Code Playgroud)

只出现第一个`Text`的第一行和第二个`Text`的前几行

出于某种原因,我所要做的就是添加minWidth: 480, idealWidth: 480到框架中并正确渲染所有内容。没想到这个,因为我已经申请了.fixedSize(),所以我想这三个中的一个就足够了。

public var body: some View {
    Form {
        Text("Lorem ipsum dolor sit amet, consectetur adipiscing elit.")
            .font(.title)

        Spacer()
            .fixedSize()

        Text("""
            Integer ut orci odio. Proin cursus ut elit eget rutrum. Nunc ante sem, euismod sed purus sed, tempus elementum elit. Phasellus lobortis at arcu quis porta. Cras accumsan leo eu tempus molestie. Suspendisse vulputate diam ipsum, et tristique lorem porta et. Pellentesque sodales est id arcu luctus venenatis.

            Vestibulum non magna lorem. In tincidunt aliquet nunc, sit amet pharetra neque hendrerit id.

            Cras sed!
            """)

        NativeButton("OK", keyEquivalent: .return) { self.screen = .game }
    }
        .frame(minWidth: 480, idealWidth: 480, maxWidth: 480)
        .fixedSize()
        .padding()
}
Run Code Online (Sandbox Code Playgroud)

所有文本都按预期显示

  • 如果任何反对票都附有评论,解释我如何使我未来的答案更有用,我将非常感激 (4认同)