【问题标题】:UIGestureRecognizer recognize order problemUIGestureRecognizer 识别订单问题
【发布时间】:2019-11-22 17:24:54
【问题描述】:

我有一个红色视图和一个绿色视图(绿色视图是 redview 的子视图),并且我为它们每个添加了一个gestureRecognizer。

grestureRecognizer 的 shouldRecognizeSimultaneouslyWith 都返回 YES。

但是当我点击绿色视图时,首先调用了红色视图的手势委托方法shouldRecognizeSimultaneouslyWith

因为我认为命中测试视图应该是绿色视图。所以绿色视图的shouldRecognizeSimultaneouslyWith 应该是第一个。

iOS如何决定首先识别哪个grestureRecognizer?

贴出代码并打印日志:

class GreenView: UIView,UIGestureRecognizerDelegate{
    override func awakeFromNib() {
        let gesture = UITapGestureRecognizer(target: self, action: #selector(greenTap))
        gesture.delegate = self
        self.addGestureRecognizer(gesture)
    }
    
    @objc func greenTap(){
        print("greenTap")
    }
    
    func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldRecognizeSimultaneouslyWith otherGestureRecognizer: UIGestureRecognizer) -> Bool {
       print("greenTap shouldRecognizeSimultaneouslyWith")

        return true
    }
    
    override func gestureRecognizerShouldBegin(_ gestureRecognizer: UIGestureRecognizer) -> Bool {
                print("green gestureRecognizerShouldBegin")
        return super.gestureRecognizerShouldBegin(gestureRecognizer)
    }
}


class RedView: UIView,UIGestureRecognizerDelegate{
    override func awakeFromNib() {
        let gesture = UITapGestureRecognizer(target: self, action: #selector(redTap))
        gesture.delegate = self
        self.addGestureRecognizer(gesture)
    }
    
    @objc func redTap(){
        print("redTap")
    }
    
    override func gestureRecognizerShouldBegin(_ gestureRecognizer: UIGestureRecognizer) -> Bool {
                print("redTap gestureRecognizerShouldBegin")
        return super.gestureRecognizerShouldBegin(gestureRecognizer)
    }
    
    func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldRecognizeSimultaneouslyWith otherGestureRecognizer: UIGestureRecognizer) -> Bool {
       print("redTap shouldRecognizeSimultaneouslyWith")

        return true
    }
}

打印出来的是:

green gestureRecognizerShouldBegin
redTap gestureRecognizerShouldBegin
green gestureRecognizerShouldBegin
redTap shouldRecognizeSimultaneouslyWith
greenTap shouldRecognizeSimultaneouslyWith
redTap
greenTap

我们可以看到 redview(superview) 的 shouldRecognizeSimultaneouslyWith 和 action 方法在 greenview(subview) 的方法之前被调用

【问题讨论】:

  • 应该为两个视图启用用户交互。所以当绿色视图被点击的时候肯定会调用绿色视图的方法。
  • 请发布您尝试过的代码。
  • 感谢@Mahendra,我已经添加了代码和日志,您可以看到 redview(superview) 的 shouldRecognizeSimultaneouslyWith 和 action 方法在 greenview(subview) 的方法之前被调用

标签: ios uikit uigesturerecognizer


【解决方案1】:

不要将绿色视图添加为红色视图的子视图。只需将绿色视图添加到其上方的红色视图之外并将约束居中到红色视图

【讨论】:

  • 谢谢,但实际上我的目的是弄清楚是什么使这个奇怪的调用顺序发生?我实际上需要在红色和绿色视图中调用 shouldRecognizeSimultaneouslyWith。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-04
  • 1970-01-01
  • 2011-11-12
  • 2020-07-11
  • 2021-05-02
  • 1970-01-01
相关资源
最近更新 更多