问题描述
使用来自 Asperi 的 this answer,我已经设法确定我的 ScrollView 在滚动时的偏移量。我通过包含 ScrollViewReader 对其进行了补充,以便我可以跳转到特定位置。
我在做什么:
- 当视图加载时,我让它自动跳转到特定行。在示例的情况下,按照 Asperi 的演示,我将移动第 50 个项目。这工作正常。
我正在尝试做但没有让它发挥作用的事情:
-
我希望当您向上移动(即向上滚动/向下滑动)时,当经过某个位置时,视图会自动跳到顶部。我使用当时确定的偏移量作为触发点(即当偏移量低于某个数字时)。理想情况下,我会使用其他东西,例如当可识别的 UI 变得可见时。这是我所追求的 1/3,但可能是三者中最不重要的。更大的问题是,我的检查似乎只有在我小心地传递触发偏移时才起作用。也就是说,我正在缓慢移动。如果我进行非慢速(不必快速)滑动,它将通过偏移量而不做任何事情。我试图通过检查特定的偏移范围而不是单个数字来改进这一点,尽管这已经有所改善,但它仍然无法始终如一地工作。
-
最后,理想情况下,当您被带到顶部时,我希望向上/向下滚动,以将您跳回到 2) 逻辑启动之前的位置,例如我的示例中的第 50 项。
如果我能获得上述任何一项(希望是所有)的指导,我将不胜感激。
代码如下:
struct DemoScrollViewOffsetView: View {
@State private var offset = CGFloat.zero
var body: some View {
ScrollView {
ScrollViewReader { value in
VStack {
ForEach(0..<100) { i in
Text("Item \(i)")
.padding()
.id(i)
}
}.background(GeometryReader {
Color.clear.preference(key: ViewOffsetKey.self,value: -$0.frame(in: .named("scroll")).origin.y)
})
.onAppear() {
value.scrollTo(50,anchor: .top) /// jump to 50th row when launching
}
.onPreferenceChange(ViewOffsetKey.self) {
print("offset >> \($0)")
if Int($0) <= 1000 && Int($0) >= 995 { /// when offset between 995 and 1000,jump to the top
withAnimation {
value.scrollTo(1)
}
}
}
}
}.coordinateSpace(name: "scroll")
}
}
struct ViewOffsetKey: PreferenceKey {
typealias Value = CGFloat
static var defaultValue = CGFloat.zero
static func reduce(value: inout Value,nextValue: () -> Value) {
value += nextValue()
}
}
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)