我试图找出用户何时与 SwiftUI 中的水平 ScrollView 交互。问题是我发现的大多数解决方案都是基于滚动视图移动的时间。这不起作用,因为滚动视图也会在用户实际移动的情况下移动。这个例子应该展示我本质上想用我的应用程序做什么:
import SwiftUI
import UIKit
struct ContentView: View {
@State var colors: [Color] = [Color.orange, Color.blue, Color.green, Color.pink]
@State var target = 0
var body: some View {
VStack {
ScrollViewReader { value in
ScrollView(.horizontal) {
HStack(spacing: 20) {
ForEach(0..<100) { i in
Rectangle().fill(colors[i % colors.count]).frame(width: 350, height: 350)
.id(i)
}
}
}
HStack {
Button("Up") {
target += 1
withAnimation(){
value.scrollTo(target, anchor: .center)
}
}
Spacer()
Button("Down") {
target -= 1
withAnimation(){
value.scrollTo(target, anchor: .center)
}
}
}
.padding()
}
}
}
}
我试图让应用程序告诉我用户何时移动滚动视图与“应用程序”何时移动滚动视图(如通过向上和向下按钮所示)。
当我尝试使用 Drag Gestures 时,它们会锁定滚动视图,即使之前有一个 Tap Gesture。更改 minimumDistance 只会触发其中一个动作,手势或滚动视图,而不是同时触发。
.onTapGesture { }
.simultaneousGesture(
DragGesture(minimumDistance: 0)
.onChanged { _ in
print("moving")
}
.onEnded { _ in
print("stopped")
})
并且类似的东西this
不起作用,因为当滚动视图以编程方式移动时,它会在用户移动它时被检测到。
如何让应用程序知道用户是否正在移动滚动视图以及何时以编程方式移动它?