小编典典

SwiftUI中的Geometry Reader是什么?

swift

我正在学习SwiftUI。我遇到了“ GeometryReader”。我想知道为什么以及何时使用它?


阅读 447

收藏
2020-07-07

共1个答案

小编典典

更新

自从发布答案以来,我还写了一篇有关GeometryReader如何工作的文章。
查看它以获取更详细的说明:https :
//swiftui-lab.com/geometryreader-to-the-rescue/


GeometryReader是一个视图,使您可以访问父级的大小和位置。例如:

struct MyView: View {
    var body: some View {
        GeometryReader { geometry in
           // Here goes your view content,
           // and you can use the geometry variable
           // which contains geometry.size of the parent
           // You also have function to get the bounds
           // of the parent: geometry.frame(in: .global)
        }
    }
}

我通常将其与.background()结合使用以获得其他视图的范围。例如,“文本”视图很难预先预测它的大小。当我需要这些信息时,可以使用以下技巧:

首先,我定义了一个名为GeometryGetter的视图:

struct GeometryGetter: View {
    @Binding var rect: CGRect

    var body: some View {
        return GeometryReader { geometry in
            self.makeView(geometry: geometry)
        }
    }

    func makeView(geometry: GeometryProxy) -> some View {
        DispatchQueue.main.async {
            self.rect = geometry.frame(in: .global)
        }

        return Rectangle().fill(Color.clear)
    }
}

然后,获取Text视图(或任何其他视图)的边界:

struct MyView: View {
    @State private var rect: CGRect = CGRect()

    var body: some View {
        Text("some text").background(GeometryGetter($rect))

        // You can then use rect in other places of your view:
        Rectangle().frame(width: 100, height: rect.height)
    }
}

注意

在GeometryGetter中,我添加了DispatchQueue.main.async {}来设置矩形。在某些情况下,否则可能会导致运行时警告:
在视图更新期间修改状态

2020-07-07