SwiftUI:VStack中的VStack,标签被截断

Posted

技术标签:

【中文标题】SwiftUI:VStack中的VStack,标签被截断【英文标题】:SwiftUI: VStack in VStack, labels are truncated 【发布时间】: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),则在添加/删除字母时会更频繁地出现此问题。 【参考方案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 中修复 :)

【讨论】:

以上是关于SwiftUI:VStack中的VStack,标签被截断的主要内容,如果未能解决你的问题,请参考以下文章

SwiftUI - 在 VStack 中对齐文本

自定义 TextField 在 SwiftUI 代码中的 VStack 中不起作用

Swiftui 将 VStack 子项高度调整为内容高度

SwiftUI,删除VStack中视图之间的空间?

SwiftUI:在带有 Spacers 的 VStack 中平均分配多个 VStack

如何在 SwiftUI 中动态调整可垂直滚动的 VStack 中的一行中的项目数?