我找到了保存 ScrollViews 的方法offset with a GeometryReader
and a PreferenceKey
.
SwiftUI |从 ScrollView 获取当前滚动位置 https://stackoverflow.com/questions/62588015/swiftui-get-current-scroll-position-from-scrollview
And the ScrollViewReader
有一个方法scrollTo
滚动到一组position.
scrollTo https://developer.apple.com/documentation/swiftui/scrollviewproxy/scrollto%28_:anchor:%29
问题是,第一个保存了offset而第二种方法期望position(或者一个 id,类似于我的情况中的位置)。如何将偏移量转换为位置/id 或者是否有其他方法来保存和加载 ScrollViews 位置?
这是我现在拥有的代码,但它没有按照我想要的方式滚动:
ScrollView {
ScrollViewReader { scrollView in
LazyVGrid(columns: columns, spacing: 0) {
ForEach(childObjects, id: \.id) { obj in
CustomView(obj: obj).id(obj.id)
}
}
.onChange(of: scrollTarget) { target in
if let target = target {
scrollTarget = nil
scrollView.scrollTo(target, anchor: .center)
}
}
.background(GeometryReader {
Color.clear.preference(key: ViewOffsetKey.self,
value: -$0.frame(in: .named("scroll")).origin.y)
})
.onPreferenceChange(ViewOffsetKey.self) { // save $0 }
}
}.coordinateSpace(name: "scroll")
并且在onAppear
我想要设置的视图scrollTarget
到保存的位置。但它滚动到任何地方,但没有滚动到我想要的位置。
我考虑过将偏移量除以一个项目的大小,但这真的是正确的方法吗?听起来不太好。