在不使用GeometryReader的情况下读取视图数组中的视图宽度,可以通过使用PreferenceKey来实现。
首先,我们需要创建一个自定义的PreferenceKey,用于存储视图宽度的值。假设我们将其命名为ViewWidthKey:
struct ViewWidthKey: PreferenceKey {
static var defaultValue: CGFloat = 0
static func reduce(value: inout CGFloat, nextValue: () -> CGFloat) {
value = nextValue()
}
}
接下来,在视图数组中的每个视图中,我们可以使用background修饰符来设置一个读取视图宽度的回调函数,并将宽度值存储到ViewWidthKey中:
struct ContentView: View {
var body: some View {
VStack {
ForEach(0..<5) { index in
Text("View \(index)")
.background(
GeometryReader { geometry in
Color.clear
.preference(key: ViewWidthKey.self, value: geometry.size.width)
}
)
}
}
.onPreferenceChange(ViewWidthKey.self) { width in
// 在这里可以获取到每个视图的宽度值
print("Width: \(width)")
}
}
}
在上述代码中,我们使用了ForEach来创建一个视图数组,然后在每个视图中使用GeometryReader来获取视图的宽度,并通过preference修饰符将宽度值存储到ViewWidthKey中。最后,我们使用onPreferenceChange修饰符来监听ViewWidthKey的变化,并在闭包中获取到每个视图的宽度值。
这样,我们就可以在不使用GeometryReader的情况下读取视图数组中的视图宽度了。
腾讯云相关产品和产品介绍链接地址:
领取专属 10元无门槛券
手把手带您无忧上云