【问题标题】:SwiftUI: VStack in VStack, labels are truncatedSwiftUI:VStack中的VStack,标签被截断
【发布时间】:2020-04-22 11:09:37
【问题描述】:

我对 SwiftUI 有疑问。当我在另一个 VStack 中使用多个 VStacks 时,我遇到了文本截断的奇怪问题。

这是最小的可重现示例:

“B”标签被截断,但它不应该被截断。如果我通过添加或删除一些字母来更改“A”文本或“B”文本,“B”标签有时会出错,有时会正常。

下面是对应的代码:

struct ContentView: View {
    var body: some View {
        VStack {
            VStack {
                Text("AAAAAAAAAAAAAAAAAAAA")
            }.background(Color.yellow)
            VStack {
                Text("BBBBBBBB")
                Text("CCC")
            }.background(Color.orange)
        }.background(Color.blue)
    }
}

我错过了什么还是这是 SwiftUI 的一个错误?

谢谢!

环境:Xcode 11.4.1、iOS 13.4.1,在预览版、模拟器和设备上测试

编辑:根据您使用的预览/模拟器设备,其行为会有所不同。例如,上面的代码,复制粘贴到一个新项目中,在 iPhone 11 Pro / 11 Pro Max 和 8+ 上是错误的。在 iPhone 8 / 11 / SE 1&2 上,这工作正常。那么可能与 SwiftUI 布局引擎中的一些计算/舍入问题有关?

【问题讨论】:

  • 你能在模拟器上检查一下应用程序的运行情况吗?我检查了一个 XCODE 11.3,它工作得很好
  • @Manoj 在模拟器和设备上同样的问题。所以也许这是 Xcode 11.4 的回归?您是否尝试添加/删除一些 A 和 B?
  • 在 Xcode 11.4.1 和 iOS 13.4.1 上运行良好
  • 它看起来确实像一个错误。仅当您添加/删除一个字符达到 20 个时才会发生这种情况。
  • @staticVoidMan 其实好像和字数没有关系,而是跟标签的宽度有关。如果您将所有大写字母(A、B 和 C)替换为它们的小写版本(a、b 和 c),则在添加/删除字母时会更频繁地出现此问题。

标签: ios swift swiftui


【解决方案1】:

.fixedSize(horizontal: true, vertical: false) 应该修复它。

struct ContentView: View {
    var body: some View {
        VStack {
            VStack {
                Text("AAAAAAAAAAAAAAAAAAAA")
                  .fixedSize(horizontal: true, vertical: false)
            }.background(Color.yellow)
            VStack {
                Text("BBBBBBBB")
                   .fixedSize(horizontal: true, vertical: false)
                Text("CCC")
                   .fixedSize(horizontal: true, vertical: false)
            }.background(Color.orange)
        }.background(Color.blue)
    }
}

对于多行文本:.fixedSize(horizontal: false, vertical: true)

struct ContentView2: View {
    var body: some View {
        VStack {
            VStack {
                Text("Swift enums are really powerful, but they can often be made even more capable when mixed with")
                  .fixedSize(horizontal: false, vertical: true)
                  .multilineTextAlignment(.center)
            }.background(Color.yellow)
            VStack {
                Text("Swift enums are really powerful, but they can often be made even more capable when mixed ")
                   .fixedSize(horizontal: false, vertical: true)
                   .multilineTextAlignment(.center)
                Text("Swift enums are really powerful, but they can often be made even more capable   ")
                   .fixedSize(horizontal: false, vertical: true)
                   .multilineTextAlignment(.center)
            }.background(Color.orange)
        }.background(Color.blue)
    }
}

struct ContentView2_Previews: PreviewProvider {
  static var previews: some View {
    ContentView2()
  }
}

【讨论】:

  • 这确实解决了 1 行标签的问题,但不能解决多行标签的问题。不幸的是,这不是用于描述长文本的解决方案,并且不符合动态类型。
  • 我更新了多行支持的答案。我不确定您所说的“符合动态类型”是什么意思,但如果您有 Binding 或 State var,它就可以正常工作。
  • 好吧不确定动态类型,还没有测试过。可能你应该更新问题和代码,当它与动态类型更多相关时......
【解决方案2】:

仅供参考:似乎已在 SwiftUI 2 中修复 :)

【讨论】:

    猜你喜欢
    • 2018-04-20
    • 2021-11-18
    • 2019-03-24
    • 2020-01-08
    • 2017-12-24
    • 1970-01-01
    • 2020-08-14
    • 1970-01-01
    • 2017-06-15
    相关资源
    最近更新 更多