当用户在 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...
    }
}

我是如何解决这个问题的?

现在,我不知道我还能做些什么来在用户垂直滚动屏幕时捕获 UIScrollView 内的触摸事件。

如有任何建议或帮助,我们将不胜感激!

此致,

彼得

所以 UIScrollView 有自己的一组手势,默认情况下 cancelsTouchesInView 设置为 true。尝试将滚动视图中的每个手势的 属性 设置为 false,如下所示:

for gesture in scrollView.gestureRecognizers ?? [] {
    gesture.cancelsTouchesInView = false
}

编辑:

此问题的解决方案是创建一个单独的自定义 UIScrollView 并在其中捕获触摸。在此线程中对其进行了详细描述:(也在评论中链接)。