SwiftUI ZStack和GeometryReader

时间:2019-09-10 14:00:34

标签: swiftui

我正在SwiftUI中制作一个简单的View,这是一个带有一行贯穿其中的框。这是(有效的)代码:

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)
    }
}

这很好用,如下所示:

ZStack with frame

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

enter image description here

1 个答案:

答案 0 :(得分:2)

GeometryReader始终尽可能地增长。如果不受任何限制(即您的ZStack frame()),那么它将占据整个屏幕。那是预期的行为。 GeometryReader尝试将其后代尽可能多地给予。

GeometryReader在水平和垂直方向都可以扩展,就像Spacer在VStack和HStack中一样。

如果不限制ZStack的大小,则ZStack将随GeometryReader一起增长。 HStack或VStack内有一个垫片的增长方式相同。