当用户在 iOS 和 Swift 上垂直滚动屏幕时,如何从 UIScrollView 捕获触摸事件?
How to capture touch events from a UIScrollView when user is scrolling the screen vertically on iOS with Swift?
我是 iOS 开发和 Swift 的新手,我遇到以下问题:
我想从屏幕上捕捉触摸事件。在常规视图中执行此操作没有问题。不幸的是,我遇到了 UIScrollView
组件的问题。当用户点击屏幕、长按屏幕或水平移动手指时,我可以捕捉触摸,但是当用户垂直移动手指并在同时,然后我无法捕捉触摸。
我在 Whosebug 上发现了一些关于类似问题的讨论帖,但那里提供的解决方案并没有解决我的问题。
我的观点结构如下:
+- View (top-level view)
|
|
+--- UIScrollView
|
|
+-- other views inside...
这是我的代码:
class MyViewController : UIViewController {
@IBOutlet weak var scrollView: UIScrollView!
override func viewDidLoad() {
super.viewDidLoad()
view.addGestureRecognizer(myRecognizer)
}
}
手势识别器已添加到顶级视图中。
我也有 UIGestureRecognizer
:
的基本自定义实现
class MyRecognizer: UIGestureRecognizer {
override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent) {
super.touchesBegan(touches, with: event)
// handle events...
}
override func touchesMoved(_ touches: Set<UITouch>, with event: UIEvent) {
super.touchesMoved(touches, with: event)
// handle events...
}
override func touchesEnded(_ touches: Set<UITouch>, with event: UIEvent) {
super.touchesEnded(touches, with: event)
// handle events...
}
}
我是如何解决这个问题的?
- 设置参数
scrollView.canCancelContentTouches = false
- 没有帮助
- 设置参数
scrollView.isScrollEnabled = false
- 我能够捕获所有触摸事件,但 scrollView 停止工作 - 没有帮助
- 向 scrollView 添加手势识别器并将其从顶级视图中删除 - 没有帮助
- 向滚动视图和顶级视图添加手势识别器 - 没有帮助
- 设置参数
scrollView.isUserInteractionEnabled = false
- 我能够捕获所有触摸事件,但 scrollView 和所有 UI 组件停止工作 - 没有帮助
- 重新排序
MyRecognizer
class 中的调用:先处理事件,然后从上层调用方法 class super.touches...
- 没有帮助
现在,我不知道我还能做些什么来在用户垂直滚动屏幕时捕获 UIScrollView
内的触摸事件。
如有任何建议或帮助,我们将不胜感激!
此致,
彼得
所以 UIScrollView 有自己的一组手势,默认情况下 cancelsTouchesInView
设置为 true。尝试将滚动视图中的每个手势的 属性 设置为 false
,如下所示:
for gesture in scrollView.gestureRecognizers ?? [] {
gesture.cancelsTouchesInView = false
}
编辑:
此问题的解决方案是创建一个单独的自定义 UIScrollView
并在其中捕获触摸。在此线程中对其进行了详细描述:(也在评论中链接)。
我是 iOS 开发和 Swift 的新手,我遇到以下问题:
我想从屏幕上捕捉触摸事件。在常规视图中执行此操作没有问题。不幸的是,我遇到了 UIScrollView
组件的问题。当用户点击屏幕、长按屏幕或水平移动手指时,我可以捕捉触摸,但是当用户垂直移动手指并在同时,然后我无法捕捉触摸。
我在 Whosebug 上发现了一些关于类似问题的讨论帖,但那里提供的解决方案并没有解决我的问题。
我的观点结构如下:
+- View (top-level view)
|
|
+--- UIScrollView
|
|
+-- other views inside...
这是我的代码:
class MyViewController : UIViewController {
@IBOutlet weak var scrollView: UIScrollView!
override func viewDidLoad() {
super.viewDidLoad()
view.addGestureRecognizer(myRecognizer)
}
}
手势识别器已添加到顶级视图中。
我也有 UIGestureRecognizer
:
class MyRecognizer: UIGestureRecognizer {
override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent) {
super.touchesBegan(touches, with: event)
// handle events...
}
override func touchesMoved(_ touches: Set<UITouch>, with event: UIEvent) {
super.touchesMoved(touches, with: event)
// handle events...
}
override func touchesEnded(_ touches: Set<UITouch>, with event: UIEvent) {
super.touchesEnded(touches, with: event)
// handle events...
}
}
我是如何解决这个问题的?
- 设置参数
scrollView.canCancelContentTouches = false
- 没有帮助 - 设置参数
scrollView.isScrollEnabled = false
- 我能够捕获所有触摸事件,但 scrollView 停止工作 - 没有帮助 - 向 scrollView 添加手势识别器并将其从顶级视图中删除 - 没有帮助
- 向滚动视图和顶级视图添加手势识别器 - 没有帮助
- 设置参数
scrollView.isUserInteractionEnabled = false
- 我能够捕获所有触摸事件,但 scrollView 和所有 UI 组件停止工作 - 没有帮助 - 重新排序
MyRecognizer
class 中的调用:先处理事件,然后从上层调用方法 classsuper.touches...
- 没有帮助
现在,我不知道我还能做些什么来在用户垂直滚动屏幕时捕获 UIScrollView
内的触摸事件。
如有任何建议或帮助,我们将不胜感激!
此致,
彼得
所以 UIScrollView 有自己的一组手势,默认情况下 cancelsTouchesInView
设置为 true。尝试将滚动视图中的每个手势的 属性 设置为 false
,如下所示:
for gesture in scrollView.gestureRecognizers ?? [] {
gesture.cancelsTouchesInView = false
}
编辑:
此问题的解决方案是创建一个单独的自定义 UIScrollView
并在其中捕获触摸。在此线程中对其进行了详细描述: