当偏移量达到一定值时让ScrollView跳转到顶部假设起始偏移量不为零

问题描述

使用来自 Asperi 的 this answer,我已经设法确定我的 ScrollView 在滚动时的偏移量。我通过包含 ScrollViewReader 对其进行了补充,以便我可以跳转到特定位置。

我在做什么:

  1. 当视图加载时,我让它自动跳转到特定行。在示例的情况下,按照 Asperi 的演示,我将移动第 50 个项目。这工作正常。

我正在尝试做但没有让它发挥作用的事情:

  1. 我希望当您向上移动(即向上滚动/向下滑动)时,当经过某个位置时,视图会自动跳到顶部。我使用当时确定的偏移量作为触发点(即当偏移量低于某个数字时)。理想情况下,我会使用其他东西,例如当可识别的 UI 变得可见时。这是我所追求的 1/3,但可能是三者中最不重要的。更大的问题是,我的检查似乎只有在我小心地传递触发偏移时才起作用。也就是说,我正在缓慢移动。如果我进行非慢速(不必快速)滑动,它将通过偏移量而不做任何事情。我试图通过检查特定的偏移范围而不是单个数字来改进这一点,尽管这已经有所改善,但它仍然无法始终如一地工作。

  2. 最后,理想情况下,当您被带到顶部时,我希望向上/向下滚动,以将您跳回到 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 (将#修改为@)