我找到了一种使用 a和 a保存 ScrollViews偏移量的方法。GeometryReader
PreferenceKey
SwiftUI | 从 ScrollView 获取当前滚动位置
并且ScrollViewReader
有一种scrollTo
滚动到设定位置的方法。
问题是,第一个方法保存了一个偏移量,而第二种方法需要一个位置(或一个 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
为保存位置的视图中。但它会滚动到任何地方,但不会滚动到我想要的位置。
我想过将偏移量除以一个项目的大小,但这真的是要走的路吗?听起来不太好。