【问题标题】:Unexpected GeometryReader view behavior inside a VStackVStack 中的意外 GeometryReader 视图行为
【发布时间】:2021-05-19 21:57:42
【问题描述】:

谁能解释一下原因:

GeometryReader 将其内容定位在左上角,而不是中心。 GeometryReader 占用所有可用空间。

struct ContentView: View {
    var body: some View {
        VStack(alignment: .center) {
            GeometryReader { geo in
                    Text("Hello, World!")
                        .frame(width: geo.size.width * 0.7, height: 40)
                        .background(Color.red)
            }
            .background(Color.yellow)

            Text("More text")
                .background(Color.blue)
        }
    }
}

看起来是这样的:

我希望它将Text“Hello, World”视图定位在中心。

【问题讨论】:

  • GeometryReader 占用所有可用空间。这是有意的,请阅读hackingwithswift.com/books/ios-swiftui/…
  • 这篇文章解释了“获取所有可用空间”,但没有关于对齐的线索,@vadian。

标签: swift swiftui


【解决方案1】:

首先,您需要进行一些重要的更改才能达到您的预期。它出现这样的原因是因为您没有以您认为应该使用的方式使用 Geometry Reader。 几何阅读器本质上是一种获取父视图大小的方法。 通常您不会使用它来布局视图,您仍然会坚持使用嵌套在几何阅读器内的 VStack、ZStack 和 HStack。这是因为阅读器会扩展以在X and Y 平面上占用尽可能多的空间。执行您期望的操作的典型结构可能如下所示。最终会将“Hello World”置于几何阅读器的中心。

GeometryReader { reader in 
    VStack {
         Spacer()
         HStack {
             Spacer()
             Text("Hello World")
             Spacer()
         Spacer()
    }
}

【讨论】:

  • 仍然不明白为什么视图默认不居中。如果没有另外说明,通常 SwiftUI 会将事情放在中间。
  • 因为它不用于布局。添加的内容,例如本例中的VStack,按大小添加,从左上角到右下角绘制。它没有用于管理内部内容的修饰符,并且需要添加某种风格的视图。同样,它的目的是提供父视图的大小,而不是布局。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多