【发布时间】:2020-07-11 19:29:37
【问题描述】:
我正在构建一个带有卡片的网格,上面有一个图像视图,底部有一些文本。这是组件的 swift UI 代码:
struct Main: View {
var body: some View {
ScrollView {
LazyVGrid(columns: .init(repeating: .init(.flexible()), count: 2)) {
ForEach(0..<6) { _ in
ZStack {
Rectangle()
.foregroundColor(Color(UIColor.random))
VStack {
Rectangle()
.frame(minHeight: 72)
Text(ipsum)
.fixedSize(horizontal: false, vertical: true)
.padding()
}
}.clipShape(RoundedRectangle(cornerRadius: 10))
}
}.padding()
}.frame(width: 400, height: 600)
}
}
此组件输出以下布局:
这看起来很棒,但我想在卡片组件中添加一个几何阅读器,以便根据封闭网格列的宽度缩放顶部图像视图。据我所知,该代码应如下所示:
struct Main: View {
var body: some View {
ScrollView {
LazyVGrid(columns: .init(repeating: .init(.flexible()), count: 2)) {
ForEach(0..<6) { _ in
ZStack {
Rectangle()
.foregroundColor(Color(UIColor.random))
VStack {
GeometryReader { geometry in
Rectangle()
.frame(minHeight: 72)
Text(ipsum)
.fixedSize(horizontal: false, vertical: true)
.padding()
}
}
}.clipShape(RoundedRectangle(cornerRadius: 10))
}
}.padding()
}.frame(width: 400, height: 600)
}
}
问题在于它呈现如下:
如您所见,我什至没有尝试使用 GeometryReader,我只是添加了它。如果我在顶层添加几何阅读器,它将正确渲染网格,但这对我来说没有多大用处,因为我计划将组件抽象为其他符合 View 的结构。此外,GeometryReader 似乎在上下文中很有用,并且考虑到几何图形来自顶层(全宽),做一堆数学将宽度值减半然后从那里进行计算是没有意义的。
我是否错误地使用了几何阅读器?我的理解是它可以在组件树的任何地方使用,而不仅仅是在顶层。
感谢观看!
【问题讨论】:
-
可以,但效果可能不同,所以您能以某种方式展示您尝试实现的目标吗?还有很多其他方法。
-
@thexande 我正在努力解决一个相同的问题——尽管网格视图被抽象为子视图。您是否设法解决了这个问题,或者解决了这个问题?
-
我最终只是硬编码了帧大小。