SwiftUI:VStack中的VStack,标签被截断
Posted
技术标签:
【中文标题】SwiftUI:VStack中的VStack,标签被截断【英文标题】:SwiftUI: VStack in VStack, labels are truncated 【发布时间】:2020-04-22 11:09:37 【问题描述】:我对 SwiftUI 有疑问。当我在另一个 VStack
中使用多个 VStack
s 时,我遇到了文本截断的奇怪问题。
这是最小的可重现示例:
“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,标签被截断的主要内容,如果未能解决你的问题,请参考以下文章
自定义 TextField 在 SwiftUI 代码中的 VStack 中不起作用