SwiftUI ZStack和GeometryReader

3

我正在使用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)
    }
}

这个代码效果很好,如下所示:

带框架的ZStack

但是,如果我删除定义ZStack框架的部分(.frame(width: 50, height: 50)),则该行会像下面所示占据整个屏幕。为什么会这样呢?

输入图片说明

1个回答

10

GeometryReader总是尽可能地增长。如果没有任何限制(即您的ZStack frame()),则它将占据整个屏幕。这是预期的行为。GeometryReader试图为其后代提供尽可能多的空间。

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

如果不限制ZStack的大小,则ZStack将随着GeometryReader的增长而增长。这与HStack或VStack在其内部有Spacer时增长的方式相同。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接