获取 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 获取的结果