【发布时间】:2021-04-08 19:38:12
【问题描述】:
使用新的ScrolLViewReader,似乎可以通过编程方式设置滚动偏移量。
但我想知道是否也可以获取当前滚动位置?
好像ScrollViewProxy 只带有scrollTo 方法,允许我们设置偏移量。
谢谢!
【问题讨论】:
使用新的ScrolLViewReader,似乎可以通过编程方式设置滚动偏移量。
但我想知道是否也可以获取当前滚动位置?
好像ScrollViewProxy 只带有scrollTo 方法,允许我们设置偏移量。
谢谢!
【问题讨论】:
以前可以阅读它。这是一个基于视图偏好的解决方案。
struct DemoScrollViewOffsetView: View {
@State private var offset = CGFloat.zero
var body: some View {
ScrollView {
VStack {
ForEach(0..<100) { i in
Text("Item \(i)").padding()
}
}.background(GeometryReader {
Color.clear.preference(key: ViewOffsetKey.self,
value: -$0.frame(in: .named("scroll")).origin.y)
})
.onPreferenceChange(ViewOffsetKey.self) { print("offset >> \($0)") }
}.coordinateSpace(name: "scroll")
}
}
struct ViewOffsetKey: PreferenceKey {
typealias Value = CGFloat
static var defaultValue = CGFloat.zero
static func reduce(value: inout Value, nextValue: () -> Value) {
value += nextValue()
}
}
【讨论】:
DemoScrollViewOffsetView 包含在NavigationView{} 中,我会在运行模拟器时在调试窗口中收到以下警告消息:Bound preference ViewOffsetKey tried to update multiple times per frame. 导致警告/错误的原因以及如何解决了吗?
VStack 上的 .background 修饰符吗?这仅仅是为了获得滚动位置吗?谢谢。