SwiftUI 内功之 布局信息GeometryReader 与 PreferenceKey
SwiftUI视图布局取决于每个视图状态。此状态由内部属性,来自环境的外部值等混合而成。对于高级自定义布局,有时视图也需要来自其子级的信息,无论该信息是否直接。
一个常见的例子是,父视图需要知道孩子的大小:
在本文中,我们探讨如何做到这一点。
视图大小是一个示例:相同的概念适用于符合的任何其他类型Equatable。
读取视图大小
当我们需要空间的信息,我们基本上在SwiftUI一个选项:GeometryReader。
GeometryReader是一个视图,它填充了水平和垂直方向上所有可用的空间,并带有一个GeometryProxy实例,使我们可以访问其容器的大小和坐标空间。
var body: some View {
GeometryReader { geometryProxy in
...
// Use geometryProxy to get space information here.
}
}
在我们的情况下,我们不想GeometryReader直接使用:相反,我们对特定视图的空间信息感兴趣。
SwiftUI提供.overlay()和.background(),分别在另一个视图的前面和后面添加了一个额外的视图。最重要的是,这些视图的建议大小等于它们应用于的视图的大小,从而使其成为我们正在寻找的对象的理想选择: