美文网首页
iOS开发中 手势冲突问题

iOS开发中 手势冲突问题

作者: 晴川历历汉阳树丶 | 来源:发表于2020-05-07 10:49 被阅读0次

    问题描述:

    在操作交互比较多的页面时,经常会遇到手势冲突的问题。有的时候两个响应区域重合,手势响应就会出现意想不到的结果。那么要怎么样控制手势响应的优先级或者干脆让所有触发到的手势都响应呢?

    解决:

    1. 设置优先级

    UIGestureRecognizer中提供了两个代理方法:

        //使gestureRecognizer优先级低于其他的手势
        func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldBeRequiredToFailBy otherGestureRecognizer: UIGestureRecognizer) -> Bool {
            return true
        }
        
        //使gestureRecognizer优先级高于其他的手势
        func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldRequireFailureOf otherGestureRecognizer: UIGestureRecognizer) -> Bool {
            return true
        }
    

    另外还有一个直接设置两个手势之间的优先级方法。

        open func require(toFail otherGestureRecognizer: UIGestureRecognizer)
    
    效果:

    普通的两个手势叠加:

        func addGes() {
            let tap1 = UITapGestureRecognizer.init(target: self, action: #selector(two))
            tap1.numberOfTapsRequired = 2
            tap1.numberOfTouchesRequired = 1
            tap1.delegate = self
            self.view.addGestureRecognizer(tap1)
    
            let view1 = UIView.init(frame: CGRect.init(x: 0, y: 0, width: 250, height: 250))
            view1.backgroundColor = .brown
            self.view.addSubview(view1)
            
            let tap2 = UITapGestureRecognizer.init(target: self, action: #selector(one))
            tap2.numberOfTapsRequired = 1
            tap2.numberOfTouchesRequired = 1
            tap2.delegate = self
            view1.addGestureRecognizer(tap2)
    
            //tap2.require(toFail: tap1)
        }
        
        @objc func one() {
            debugPrint(444444)
        }
        
        @objc func two() {
            debugPrint(333333)
        }
    
    

    打印结果:

    1. 点击一下
    444444
    

    立即响应并打印444444

    2.连续点击两下

    444444
    333333
    

    可以清楚的看到,我们点到了两区域重合的位置,不论我们是需要响应单击还是双击,很显然结果不如意。因为我们点了两次,单击只响应了一次。响应了双击,却也响应了一次单击。

    打开上面代码中的

      tap2.require(toFail: tap1)
    

    再次测试:

    1. 点击一下
    444444
    

    虽然也是打印的 444444,但是,不像是之前立马打印,而是等tap1的双击响应失效之后才打印的。

    2.连续点击两下

    333333
    

    因为tap1的优先级大于tap2,所以在进行tap2单击的时候,需要等到tap1响应时间失效之后才会触发。而一旦tap1的双击成功响应了,那tap2的单击则取消响应。所以只会响应tap1。

    2. 设置同时响应

    UIGestureRecognizer中同时也提供了一个多手势同时响应的接口。

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

    开启多手势响应之后再来看一下

    1. 点击一下
    444444
    

    2.连续点击两下

    333333
    

    跟上面设置了 tap2.require(toFail: tap1)的效果一样。

    因为多手势响应开启和两手势优先级设置同时设置时,会依从优先级关系。

    去掉 tap2.require(toFail: tap1)再来看:

    1. 点击一下
    444444
    

    立即响应并打印444444

    2.连续点击两下

    444444
    333333
    444444
    

    两次的单击都响应了,并且同时响应了双击手势。

    相关文章

      网友评论

          本文标题:iOS开发中 手势冲突问题

          本文链接:https://www.haomeiwen.com/subject/dqsoghtx.html