我试图通过将 GeometryReader 放置在 ScrollView 中来获得滚动偏移,但它禁用了滚动(LazyVStack 的区域在尝试滚动时反弹)。看起来 GeometryReader 的大小与 LazyVStack 完全相同,而 LazyVStack 的高度为 .infinite,因此滚动不起作用。
我尝试在 ScrollView 周围放置 GeometryReader 并且滚动效果很好,但我没有从 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()
}
}