我正在学习SwiftUI。我遇到了“ GeometryReader”。我想知道为什么以及何时使用它?
自从发布答案以来,我还写了一篇有关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 {}来设置矩形。在某些情况下,否则可能会导致运行时警告: 在视图更新期间修改状态 。