【问题标题】:Get the current scroll position of a SwiftUI ScrollView获取 SwiftUI ScrollView 的当前滚动位置
【发布时间】:2021-04-08 19:38:12
【问题描述】:

使用新的ScrolLViewReader,似乎可以通过编程方式设置滚动偏移量。

但我想知道是否也可以获取当前滚动位置?

好像ScrollViewProxy 只带有scrollTo 方法,允许我们设置偏移量。

谢谢!

【问题讨论】:

标签: ios swift swiftui xcode12


【解决方案1】:

以前可以阅读它。这是一个基于视图偏好的解决方案。

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()
    }
}

【讨论】:

  • 可以设置吗?
  • @Asperi - 如果我将DemoScrollViewOffsetView 包含在NavigationView{} 中,我会在运行模拟器时在调试窗口中收到以下警告消息:Bound preference ViewOffsetKey tried to update multiple times per frame. 导致警告/错误的原因以及如何解决了吗?
  • 我是 SwiftUI 的新手——这个解决方案对我有用,但你能解释一下 VStack 上的 .background 修饰符吗?这仅仅是为了获得滚动位置吗?谢谢。
  • @Asperi 如果不使用,为什么还要声明 offset var?
  • @Vee 我也有同样的问题。解决了吗?
猜你喜欢
  • 1970-01-01
  • 2019-10-20
  • 2021-08-01
  • 2013-04-06
  • 2015-07-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多