【问题标题】:SwiftUI views in VStack are overlapping each otherVStack 中的 SwiftUI 视图相互重叠
【发布时间】:2019-11-14 16:03:44
【问题描述】:

我在 VStack 中有两个视图。在我尝试在辅助功能设置中放大字体之前,一切看起来都很好。然后由于某种原因堆栈没有扩展以容纳两个视图。相反,它将一个视图推到另一个视图之上。见下文。

如何正确对齐这些?下面是我的代码。

 var body: some View {
    VStack(spacing: 10) {
        Text("Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.")
            .fixedSize(horizontal: false, vertical: true)
            .padding()

        GeometryReader { geometry in
            VStack(spacing: 0) {
                Image("tmp")
                    .resizable()
                    .scaledToFill()
                    .frame(width: geometry.size.width * 0.88)

                VStack(spacing: 10) {
                    Text("Lorem ipsum dolor sit amet, consectetur adipiscing elit")
                        .frame(width: geometry.size.width * 0.8, alignment: .leading)
                        .fixedSize(horizontal: false, vertical: true)

                    Text("Lorem ipsum dolor sit amet, consectetur adipiscing elit")
                        .frame(width: geometry.size.width * 0.8, alignment: .leading)
                        .fixedSize(horizontal: false, vertical: true)

                    Text("Lorem ipsum dolor sit amet, consectetur adipiscing elit")
                        .frame(width: geometry.size.width * 0.8, alignment: .leading)
                        .fixedSize(horizontal: false, vertical: true)
                }
                .padding()
                .background(
                    Rectangle()
                        .fill(Color.white)
                )
            }
            .cornerRadius(10)
            .edgesIgnoringSafeArea(.all)
        }
        .scaledToFit()
        .shadow(color: .gray, radius: 10, x: 5, y: 5)
        .scaledToFill()

        Spacer()
    }
    .background(Rectangle()
        .fill(Color.gray)
        .scaledToFill())
}

【问题讨论】:

  • 你可以去掉第一个`.fixedSize(horizo​​ntal: false, vertical: true)` 上面的文字在哪里
  • 你为什么不给他们填充呢?

标签: swiftui


【解决方案1】:

问题:

重叠的问题与本节有关:

    .scaledToFit() // Not needed
    .shadow(color: .gray, radius: 10, x: 5, y: 5)
    .scaledToFill() // Not needed

答案:

你不需要scaledToFitscaledToFill


可视化问题:

使用scaledToFill:

使用scaledToFit:

看到蓝色边框了吗?这就是问题所在。


一些提示:

  1. 无需为背景颜色创建虚拟矩形。 .background 修饰符可以直接接受颜色,如:
.background(Color.gray)
  1. 您可以忽略安全区域仅适用于 background 修饰符,例如:
.background(Color.gray.edgesIgnoringSafeArea(.all))
  1. 不要重复修饰符!将它们组合在一起并应用一次,如下所示:
Group {
    Text("Lorem ipsum dolor sit amet, consectetur adipiscing elit")
    Text("Lorem ipsum dolor sit amet, consectetur adipiscing elit")
    Text("Lorem ipsum dolor sit amet, consectetur adipiscing elit")
}
.frame(width: geometry.size.width * 0.8, alignment: .leading)
.fixedSize(horizontal: false, vertical: true)
  1. 在浮点数中乘以宽度可能会导致misaligned 图像。所以总是将结果四舍五入:
(geometry.size.width * 0.88).rounded(.down)

结果:

图片:

重构代码:

var body: some View {
    VStack(spacing: 10) {
        Text("Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.")
            .padding()

        GeometryReader { geometry in
            VStack(spacing: 0) {
                Image("tmp")
                    .resizable()
                    .scaledToFill()
                    .frame(width: (geometry.size.width * 0.88).rounded(.down))

                VStack(spacing: 10) {
                        Text("Lorem ipsum dolor sit amet, consectetur adipiscing elit")
                        Text("Lorem ipsum dolor sit amet, consectetur adipiscing elit")
                        Text("Lorem ipsum dolor sit amet, consectetur adipiscing elit")
                }
                .frame(width: (geometry.size.width * 0.8).rounded(.down), alignment: .leading)

                .padding()
                .background(Color.white)
            }
            .cornerRadius(10)
        }
        .shadow(color: .gray, radius: 10, x: 5, y: 5)
        Spacer()
    }
    .background(Color.gray.edgesIgnoringSafeArea(.all))
}

【讨论】:

  • 非常感谢您的详细回答。我确实按照您的建议清理了我的代码。但不幸的是,问题没有得到解决。图像现在消失了。我忘了提到当我放大字体时会发生这种情况。我正在更新我的问题。
  • 那是因为屏幕不够大,无法容纳所有内容。那么你应该再考虑一下在这种情况下你想如何显示你的views。也许使用ScrollView 是一个不错的选择,但使用ScrollView 有点棘手,您可能希望摆脱GeometryView 并改用padding
  • 做到了!我摆脱了 GeometryReader 并添加了一个 ScrollView,它现在渲染得很好。
【解决方案2】:

尝试将图像上的修饰符更改为以下内容。

Image("tmp")
    .resizable()
    .scaledToFit()
    .frame(maxWidth: geometry.size.width * 0.88)

【讨论】:

  • 当我这样做时,图像完全消失了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-09-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多