自定义 UIGestureRecognizer 失败后 UIPinchGestureRecognizer 不会触发

Posted

技术标签:

【中文标题】自定义 UIGestureRecognizer 失败后 UIPinchGestureRecognizer 不会触发【英文标题】:UIPinchGestureRecognizer doesn't fire after custom UIGestureRecognizer fails 【发布时间】:2017-06-09 06:57:31 【问题描述】:

我有一个自定义的UIGestureRecognizer 子类,可以检测一种特定类型的单指拖动。在同一个场景中,我还有一个UIPinchGestureRecognizer,它可以检测到两指捏合。

当用户做出捏合手势但在另一只手指之前立即放下一根手指时会出现问题:自定义手势识别器看到单次触摸并接合(将其状态设置为.began)而捏合识别器没有.添加第二次触摸时,自定义识别器会注意到并将其状态切换为.failed。但为时已晚,捏合手势识别器无法识别。

这是自定义 UIGestureRecognizer 子类的代码:

override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent) 
    super.touchesBegan(touches, with: event)
    guard touches.count == 1 else 
        state = .failed
        return
    
    state = .began

override func touchesMoved(_ touches: Set<UITouch>, with event: UIEvent) 
    super.touchesMoved(touches, with: event)
    guard touches.count == 1 else 
        state = .failed
        return
    
    // do gesture recognizer stuff here


override func touchesEnded(_ touches: Set<UITouch>, with event: UIEvent) 
    super.touchesEnded(touches, with: event)
    state = .ended

我已经尝试将cancelsTouchesInView 设置为false 并将delaysTouchesBegan 设置为true 用于自定义手势识别器。两者都没有改变这种行为。

当我使用 UIPinchGestureRecognizerUIPanGestureRecognizer 时,我没有遇到这个问题,这让我认为这不是预期的行为。

我的 UIGestureRecognizer 失败代码出了什么问题,我该如何解决它,以便 UIPinchGestureRecognizer 仍然可以识别非同时开始触摸的夹点?

【问题讨论】:

你找到解决办法了吗? @agibson007 遗憾的是没有;我的项目需求发生了变化,因此我不需要自定义子类,而且我也从不费心跟进。 【参考方案1】:

尝试使用UIGestureRecognizerDelegate 协议来实现gestureRecognizer(_:shouldRecognizeSimultaneouslyWith:)。这可以让您同时识别两个手势。

class MyVC: UITableViewController, UIGestureRecognizerDelegate 

    override func viewDidLoad() 
        let pinchGestureRecognizer = UIPinchGestureRecognizer(target: self, action: #selector(handlePinchFrom))
        pinchGestureRecognizer.delegate = self
        view.addGestureRecognizer(pinchGestureRecognizer)
    

    func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldRecognizeSimultaneouslyWith otherGestureRecognizer: UIGestureRecognizer) -> Bool 
        return true
    

【讨论】:

以上是关于自定义 UIGestureRecognizer 失败后 UIPinchGestureRecognizer 不会触发的主要内容,如果未能解决你的问题,请参考以下文章

UIGestureRecognizer 从头开始​​制作 UISlider

使用 UIGestureRecognizer 传递奇怪的 ios 触摸事件

UIGestureRecognizer 处理 UITableView 中的触摸

如何使用 UIGestureRecognizer 交换视图

UIGestureRecognizer 在 UIImageView 上无法正常工作

与 UIGestureRecognizer 一起监听 UITouch 事件