gpt4 book ai didi

ios - SwiftUI - 检测 ScrollView 何时完成滚动?

转载 作者:行者123 更新时间:2023-12-03 09:30:06 26 4
gpt4 key购买 nike

我需要找出我的 ScrollView 的确切时刻。停止移动。
SwiftUI 有可能吗?
Here相当于UIScrollView .
想了很多之后还是不知道...
一个用于测试的示例项目:

struct ContentView: View {

var body: some View {
ScrollView {
VStack(spacing: 20) {
ForEach(0...100, id: \.self) { i in
Rectangle()
.frame(width: 200, height: 100)
.foregroundColor(.green)
.overlay(Text("\(i)"))
}
}
.frame(maxWidth: .infinity)
}
}
}
谢谢!

最佳答案

这是一个可能方法的演示 - 使用更改滚动内容坐标和去抖动的发布者,因此仅在坐标停止更改后才报告事件。
使用 Xcode 12.1/iOS 14.1 测试
更新:验证与 Xcode 13.3/iOS 15.4 一起使用
注意:您可以使用 debounce period 来调整它以满足您的需要。
demo

import Combine

struct ContentView: View {
let detector: CurrentValueSubject<CGFloat, Never>
let publisher: AnyPublisher<CGFloat, Never>

init() {
let detector = CurrentValueSubject<CGFloat, Never>(0)
self.publisher = detector
.debounce(for: .seconds(0.2), scheduler: DispatchQueue.main)
.dropFirst()
.eraseToAnyPublisher()
self.detector = detector
}

var body: some View {
ScrollView {
VStack(spacing: 20) {
ForEach(0...100, id: \.self) { i in
Rectangle()
.frame(width: 200, height: 100)
.foregroundColor(.green)
.overlay(Text("\(i)"))
}
}
.frame(maxWidth: .infinity)
.background(GeometryReader {
Color.clear.preference(key: ViewOffsetKey.self,
value: -$0.frame(in: .named("scroll")).origin.y)
})
.onPreferenceChange(ViewOffsetKey.self) { detector.send($0) }
}.coordinateSpace(name: "scroll")
.onReceive(publisher) {
print("Stopped on: \($0)")
}
}
}

struct ViewOffsetKey: PreferenceKey {
typealias Value = CGFloat
static var defaultValue = CGFloat.zero
static func reduce(value: inout Value, nextValue: () -> Value) {
value += nextValue()
}
}

backup

关于ios - SwiftUI - 检测 ScrollView 何时完成滚动?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65062590/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com