SwiftUI ZStack 和 GeometryReader

coc*_*oco 1 swiftui

我正在 SwiftUI 中创建一个简单的视图,一个有一条线穿过它的盒子。这是(工作)代码:

struct DrawLine: View {
    let boxSize = CGFloat(300.0)

    var body: some View {
        ZStack {
            Rectangle()
                .stroke(lineWidth: 2.0)
                .fill(Color.purple)
                .frame(width: self.boxSize, height: self.boxSize, alignment: .center)## Heading ##

            GeometryReader { geometry in
                Path { path in
                    path.move(to: CGPoint(x: 1, y: 1))
                    path.addLine(to: CGPoint(x: geometry.size.width - 1, y: geometry.size.height - 1))
                }
                .stroke(lineWidth: 2)
                .fill(Color.orange)
            }
        }
        .frame(width: 50, height: 50).border(Color.black)
    }
}
Run Code Online (Sandbox Code Playgroud)

这很好用,如下所示:

带框架的 ZStack

但是,如果我用框架 ( .frame(width: 50, height: 50))取出定义 ZStack 的位,则该行会占据整个屏幕,如下所示。这是为什么?

在此处输入图片说明

kon*_*iki 6

GeometryReader 总是尽可能地增长。如果不受任何限制(即您的 ZStack frame()),则它会占据整个屏幕。这就是预期的行为。GeometryReader 正试图为它的后代提供尽可能多的东西。

GeometryReader 水平和垂直扩展,就像 Spacer 在 VStack 和 HStack 中所做的那样。

如果不限制 ZStack 的大小,ZStack 将随 GeometryReader 一起增长。与 HStack 或 VStack 增长的方式相同,其中包含 Spacer。