我试图通过将GeometryReader 放置在 ScrollView 内来获得滚动偏移,但它禁用了滚动(LazyVStack 的区域在滚动尝试时反弹)。似乎 GeometryReader 的大小与 LazyVStack 完全相同,而 LazyVStack 的高度为 .infinite ,因此滚动不起作用。
我尝试将GeometryReader 放置在 ScrollView 周围并且滚动效果很好,但我没有收到来自 onPreferenceChange 的任何数据。是否有任何解决方法可以使它们(滚动和 onPreferenceChange 报告)都起作用?
import SwiftUI
struct ContentView: View {
var body: some View {
VStack {
ScrollView {
GeometryReader { insideProxy in
LazyVStack(spacing: 0) {
ForEach(0...100, id:\.self) { val in
ZStack {
Text("test")
.font(.system(size: 128))
} // ZStack
.background(Color.blue)
} // ForEach
.background(Color.yellow)
}.preference(
key: OffsetPreferenceKey.self,
value: insideProxy.frame(in: .global).minY
)
.background(Color.red)
}
}
.padding(.top, 40)
}
.onPreferenceChange(OffsetPreferenceKey.self) { newValue in
print("The new value is: \(newValue)")
}
}
}
private struct OffsetPreferenceKey: PreferenceKey {
static var defaultValue: CGFloat = .zero
static func reduce(value: inout CGFloat, nextValue: () -> CGFloat) {}
}
struct ContentView_Previews: PreviewProvider {
static var previews: some View {
ContentView()
}
}