自从发布答案以来,我还写了一篇有关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 {}来设置矩形。在某些情况下,否则可能会导致运行时警告:
在视图更新期间修改状态 。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)