SwiftUI 填充距离不一致

Posted

技术标签:

【中文标题】SwiftUI 填充距离不一致【英文标题】:SwiftUI padding distance is not consistent 【发布时间】:2021-03-11 22:22:07 【问题描述】:

我在 macOS 11.2.2 上使用 Xcode 12.4 和 Swift 5.4 我想控制两个Text 视图之间的空间。自然会想到padding。这是代码

VStack(alignment: .leading) 
    Text("Exploring San Francisco")
        .font(.appTitle1)
        .fontWeight(.bold)
        .padding(.bottom, 0)
    Text("May 1, 2021 - May 5, 2021")
        .font(.appSmallBody)
        .fontWeight(.bold)
        .textCase(.uppercase)
        .foregroundColor(.init(hex: "666666"))

请注意,我明确写底部填充为 0px。结果如下:

现在,如果我希望它们之间有 1px 的填充,那么填充会变得太大。这是底部填充 1 px 的结果:

如你所知,它们之间的距离绝对不是 1px,而更像是 10px。

但是,如果我将内边距增加到 2px,您几乎看不出 1px 和 2px 之间的区别:

为什么填充距离不一致?

我发现的唯一解决方法是删除padding 并使用VStackspacing 参数:

VStack(alignment: .leading, spacing: 1) 
    Text("Exploring San Francisco")
        .font(.appTitle1)
        .fontWeight(.bold)
    Text("May 1, 2021 - May 5, 2021")
        .font(.appSmallBody)
        .fontWeight(.bold)
        .textCase(.uppercase)
        .foregroundColor(.init(hex: "666666"))

但是当堆栈中有多个视图并且我想自定义每对视图之间的距离时,这并不理想。

这是一个 SwiftUI 错误吗?这个问题有更优雅的解决方法吗?谢谢!

【问题讨论】:

可能你想使用 EdgeInsets 而不是填充。 developer.apple.com/documentation/swiftui/edgeinsets @greenhorn 我试过了,和直接使用padding效果一样。距离仍然不一致。事实上,我相信the padding function I use 是padding function with EdgeInSets 的包装器 您还可以为需要自定义的每一对嵌套多个具有单独间距的 VStack。 @greenhorn 是的,这就是我现在正在做的事情,我正在处理超过 10 个嵌套的 VStack,而且维护起来并不容易。 【参考方案1】:

您可以尝试执行以下操作: 基本上在 vstack 上声明间距:0,然后更改填充,它会按照你想要的方式运行。

    VStack(alignment: .leading, spacing: 0) 
        Text("Exploring San Francisco")
            .font(.title)
            .fontWeight(.bold)
            .lineLimit(1)

        Text("May 1, 2021 - May 5, 2021")
            .font(.subheadline)
            .fontWeight(.bold)
            .textCase(.uppercase)
            .foregroundColor(Color.gray)
            .padding(.top, 1)
    

更改示例中的最后一行,您可以看到与

的区别

.padding(.top, 0)

.padding(.top, 1)

.padding(.top, 5)

【讨论】:

有效!所以我猜 SwiftUI 填充实际上是在幕后添加一个视图,而 VStack 将额外的视图视为需要间距的东西。这绝对是苹果需要解决的问题。但是,嘿,这为我节省了大量时间和大量堆栈:)

以上是关于SwiftUI 填充距离不一致的主要内容,如果未能解决你的问题,请参考以下文章

SwiftUI - 文本和形状位置之间的不一致

SwiftUI ObservableObject 的行为不一致,具体取决于调用站点的来源

计算两个纬度/经度点之间的距离不一致

Xcode如何在预览(Preview)调试中避免与SwiftUI正常运行时环境不一致导致的崩溃

Xcode如何在预览(Preview)调试中避免与SwiftUI正常运行时环境不一致导致的崩溃

计算点之间的距离时不一致