ios 文本不会在swift UI中换行

hgb9j2n6  于 2022-12-24  发布在  iOS
关注(0)|答案(9)|浏览(348)

即使设置了.lineLimit(nil),文本也不会换行。

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))
}

2sbarzqh

2sbarzqh1#

在花了很多时间处理这样的错误之后,我不能100%确定这是lineLimit问题。在写这篇文章时,我发现对于更复杂的视图的解决方案是下面的代码片段,以防止 Package :
第一个月
这样可以防止解释器垂直折叠文本。

kqhtkvqz

kqhtkvqz2#

截至Xcode 11.3 / Swift 5.1的完整解决方案可在此处的多个答案中找到。
发生这种情况的原因可在Matteo Pacini's answer中找到:使用预定义的.font(.title).font(.headline)等似乎会带来这样的行为,即这些Text视图将自己的大小调整为始终是椭圆形而不是换行。
Sharpienero's answer中提供了最佳解决方法:将.fixedSize(horizontal: false, vertical: true)添加到Text视图中,这将告诉Text视图不要执行其自定义调整大小的水平逻辑NOT省略号,这将使其遵循我们都习惯的标准规则。
感谢他们两个!

qyzbxkaa

qyzbxkaa3#

尝试将第二个文本的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))

结果:

kq0g1dla

kq0g1dla4#

看起来font包含换行属性。
如果您将其更改为body,则其 Package 正确!

gr8qqesn

gr8qqesn5#

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

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()
}

出于某种原因,我所要做的就是将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()
}

ao218c7q

ao218c7q6#

快速用户界面

.lineLimit(空)与.lineLimit(任意数字)

VStack(alignment: .leading, spacing: 16.0) {
// Sets the maximum number of lines that text can occupy in the view.

      Text("SwiftUI is a user interface toolkit that lets us design apps in a declarative way. ")
      .font(.title)
      .lineLimit(3)

// But if you don't know about the the text size then Sets nil in the lineLimit.

      Text("SwiftUI is a user interface toolkit that lets us design apps in a declarative way. That's a fancy way of saying that we tell SwiftUI how we want our UI to look and work, and it figures out how to make that happen as the user interacts with it.... ")
       .font(.body)
       .lineLimit(nil)
}.padding(EdgeInsets(top: 0, leading: 8, bottom: 0, trailing: 8))
ghhaqwfi

ghhaqwfi7#

我遇到过一个涉及UIViewRepresentable Package 的UITextField的情况,它显示为:

VStack {
    Text("Long enough to wrap....")
    Spacer().frame(height: 40)
    CustomTextField()
}

当我添加CustomTextField时,Text停止了 Package 。我对Text所做的一切都无济于事。如果我删除Spacer(),它 Package 得很好!!
最后我删除了X1 M6 N1 X,并在X1 M7 N1 X中添加了底部填充。据我所知,我的X1 M8 N1 X很好,我不明白为什么它会影响SwiftUI布局算法。

yxyvkwin

yxyvkwin8#

唯一对我有效的答案是在文本上应用.fixedSize(horizontal: false, vertical: true)
我说“有点”是因为,通过使用.fixedSize,SwiftUI将完全忽略父节点给定的大小并使其溢出。如果父节点有背景,布局将被破坏。如果父节点有兄弟节点,文本将呈现在其上面。
我真的相信苹果应该给予我们一个选择,让一个文本的理想大小是它的多行版本,而不是单行对应。
虽然没有发生这种情况,但我使用了下面的怪物,但它工作:

struct AdaptiveText: View {
  @State private var height: CGFloat?
  var text: String
  
  private func updateHeight(height: CGFloat) -> some View {
    DispatchQueue.main.async {
      self.height = height
    }
    return Color.clear
  }
  
  var body: some View {
    ZStack {
      Text(text)
        .fixedSize(horizontal: false, vertical: true)
        .background() {
          GeometryReader { geo in
            updateHeight(height: geo.size.height)
          }
        }
        .opacity(0)
      
      Text(text)
    }.frame(width: nil, height: height)
  }
}
wsxa1bj1

wsxa1bj19#

我刚加了

.padding()

到我的Text示例,它工作了

相关问题