获取 SwiftUI ScrollView 的当前滚动位置

Posted

技术标签:

【中文标题】获取 SwiftUI ScrollView 的当前滚动位置【英文标题】:Get the current scroll position of a SwiftUI ScrollView 【发布时间】:2020-06-26 04:25:07 【问题描述】:

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

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

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

谢谢!

【问题讨论】:

此问题可能重复:***.com/questions/59342384/… 【参考方案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 我也有同样的问题。解决了吗?

以上是关于获取 SwiftUI ScrollView 的当前滚动位置的主要内容,如果未能解决你的问题,请参考以下文章

SwiftUI - 如何获取 ScrollView 内容的大小(高度)

SwiftUI ScrollView:查找当前在屏幕中心可见的子视图。子视图在 ScrollView 中的位置。偏好键。滚动视图代理

如何使用 SwiftUI 获取 ScrollView 的动态文本高度

SwiftUI ScrollView 不显示从 ObservableObject 获取的结果

SwiftUI - 如何在运行时更改内部内容后获取 ScrollView 内容高度

ScrollView 位置数据 / SwiftUi