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)
}
}
}
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)
}
}
3条答案
按热度按时间mccptt671#
更新
自从我发布了答案之后,我还写了一篇关于GeometryReader如何工作的文章。查看它以获得更详细的解释:https://swiftui-lab.com/geometryreader-to-the-rescue/
GeometryReader是一个视图,可用于访问其父级的大小和位置。例如:
我通常将它与.background()结合使用来获得其他视图的边界,例如,文本视图很难提前预测它的大小,当我需要这些信息时,我使用以下技巧:
首先,我定义了一个名为GeometryGetter的视图:
然后,要获取文本视图(或任何其他视图)的边界:
对于一些用例,我发布了一些使用GeometryReader的其他问题的答案。
移动文本字段以避免被键盘隐藏:https://stackoverflow.com/a/56721268/7786555
如何在SwiftUI中使视图大小与另一个视图相同:https://stackoverflow.com/a/56661706/7786555
注
在GeometryGetter中,我添加了一个DispatchQueue.main.async {}来设置矩形。在某些情况下,它可能会导致运行时警告:* 在视图更新期间修改状态 *。
icnyk63a2#
SwiftUI中的
Reader
是什么?除了kontiki的答案之外,
Reader
是容器视图,将其内容定义为函数。因此,它们可以对parent
具有一些访问权限和能力。如果您仔细观察,它们是通用结构体,SwiftUI 2.0中现在有两个阅读器可用:请注意,这只是一个约定,他们不符合特殊协议更多的
View
协议。几何阅读器
这是一个容器视图,它将内容定义为自身大小和坐标空间的函数。因此,您可以检测框架和位置变化以及
GeometryReader
中任何视图的当前状态。此阅读器的一个流行用法是,当您需要单独堆栈中的单独视图具有相同(或相对)大小时。滚动视图阅读器
这个视图的子视图被定义为
ScrollViewProxy
的函数,目标是子视图中的可滚动视图,所以你可以访问滚动视图,比如**scrolling to a specific item in a list**或者类似的东西。为了尽量减少重复,我没有张贴的例子,你可以检查链接的更多信息,如果你想
3xiyfsfu3#
GeometryReader是识别父视图几何图形的工具,意味着当你在几何图形中创建视图时,你会得到父视图的大小。