什么是SwiftUI中的几何图形阅读器?

qzwqbdag  于 2022-12-17  发布在  Swift
关注(0)|答案(3)|浏览(179)

我正在学习SwiftUI。我偶然发现了“几何阅读器”。我想知道为什么和什么时候使用它?

mccptt67

mccptt671#

更新

自从我发布了答案之后,我还写了一篇关于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)
    }
}

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

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

对于一些用例,我发布了一些使用GeometryReader的其他问题的答案。
移动文本字段以避免被键盘隐藏:https://stackoverflow.com/a/56721268/7786555
如何在SwiftUI中使视图大小与另一个视图相同:https://stackoverflow.com/a/56661706/7786555

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

icnyk63a

icnyk63a2#

SwiftUI中的Reader是什么?

除了kontiki的答案之外,Reader是容器视图,将其内容定义为函数。因此,它们可以对parent具有一些访问权限和能力。如果您仔细观察,它们是通用结构体,SwiftUI 2.0中现在有两个阅读器可用:
请注意,这只是一个约定,他们不符合特殊协议更多的View协议。

几何阅读器

struct GeometryReader<Content: View> : View

这是一个容器视图,它将内容定义为自身大小和坐标空间的函数。因此,您可以检测框架和位置变化以及GeometryReader中任何视图的当前状态。此阅读器的一个流行用法是,当您需要单独堆栈中的单独视图具有相同(或相对)大小时。

滚动视图阅读器

struct ScrollViewReader<Content: View> : View

这个视图的子视图被定义为ScrollViewProxy的函数,目标是子视图中的可滚动视图,所以你可以访问滚动视图,比如**scrolling to a specific item in a list**或者类似的东西。
为了尽量减少重复,我没有张贴的例子,你可以检查链接的更多信息,如果你想

3xiyfsfu

3xiyfsfu3#

GeometryReader是识别父视图几何图形的工具,意味着当你在几何图形中创建视图时,你会得到父视图的大小。

相关问题