【发布时间】:2020-10-28 13:21:43
【问题描述】:
我正在尝试使用可以点击和拖动的元素来实现 ScrollView。它应该按以下方式工作:
- ScrollView 应该可以正常工作,因此向上/向下滑动不会干扰手势。
- 点击一个条目应该运行一些代码。如果有一个“点击指示器”那就太好了,这样用户就知道点击已被注册(困难在于点击指示器应该在触摸 down 时触发,而不是在触摸向上,并且应该在手指松开之前一直处于活动状态。
- 长按条目应激活拖动手势,以便可以移动项目。
下面的代码涵盖了所有这些要求(点击指示器除外)。但是,我不确定 为什么 它有效,具体来说,为什么我需要使用 .highPriorityGesture 并且例如不能使用 .sequenced(before: ...) 对 Tap Gesture 和 DragGesture 进行排序(这将阻止滚动)。
另外,我希望收到有关触地事件的通知(不是触地,请参阅 2.)。我尝试使用 LongPressGesture() 而不是 TapGesture(),但这也会阻止 ScrollView 滚动,之后甚至不会触发 DragGesture。
有人知道如何实现吗?还是这就是 SwiftUI 的极限?如果是这样,是否有可能移植 UIKit 的东西来实现这一点(我也已经尝试过,但没有成功,ScrollView 的内容也应该是动态的,所以移植整个 ScrollView 可能很困难)?
感谢您帮助我!
struct ContentView: View {
var body: some View {
ScrollView() {
ForEach(0..<5, id: \.self) { i in
ListElem()
.highPriorityGesture(TapGesture().onEnded({print("tapped!")}))
.frame(maxWidth: .infinity)
}
}
}
}
struct ListElem: View {
@GestureState var dragging = CGSize.zero
var body: some View {
Circle()
.frame(width: 100, height: 100)
.gesture(DragGesture(minimumDistance: 0, coordinateSpace: .global)
.updating($dragging, body: {t, state, _ in
state = t.translation
}))
.offset(dragging)
}
}
【问题讨论】:
-
检查我的答案,看看这是否适合你,或者是否有什么事情没有按预期工作。
-
@leonboe1 有没有找到不阻止
scrollView滚动的解决方案? -
很遗憾没有。
-
我发现了一些有用的东西stackoverflow.com/a/59961959/11460922
-
已经试过了,但对我一点用都没有