避免三手指在UIPinchGestureRecognizer中快速捏

时间:2018-08-14 05:04:03

标签: ios swift uipinchgesturerecognizer

根据Apple文档的说明,捏是连续的手势,意味着必须用两只手指使用。即使用三根手指捏合,在Swift 4.1中也能正常工作。

我尝试打印触摸次数。即使使用三个手指,触摸的次数仍为2。看来它检测到前2个手指触摸而忽略了第三个手指。因此无法过滤。

@objc func pinch(pinchGesture: UIPinchGestureRecognizer){
  if pinchGesture.state == UIGestureRecognizerState.began {
    print("number of touches:\(pinchGesture.numberOfTouches)")
  }
}

我在viewDidLoad中调用setupGesture()方法。因此,它可以处理相关的用户捏合手势。

func setupGestures(){

        let pinch = UIPinchGestureRecognizer(target: self, action: #selector(self.pinch))
        pinch.delegate = self
        self.addGestureRecognizer(pinch)

    }

有什么可能的方法来避免在iOS中捏三个手指?

2 个答案:

答案 0 :(得分:1)

您可以过滤触摸:

func touchesBegan(_ touches: Set<UITouch>, 
         with event: UIEvent)

例如,从参数touches获取触摸次数,如果touches.count > 2则不对该手势进行操作-忽略它。

编辑(1):

编辑后,我有另一个主意(我没有Mac,所以现在无法尝试)。尝试使用委托中的this method。在接受之前,您应该能够取得联系。我看不到该信息是否被调用一次,或者每次触摸(每个手指)一次被调用的信息。也许您可以通过某种方式使用它?

答案 1 :(得分:0)

最近我想出了解决此问题的方法,这可能不是最佳解决方案,也可以是替代方法。但这有效。

这里我只保留一个布尔值

 var numberOfAllTouchesLessThanOrEqualsToTwo = false

我使用事件处理程序来设置布尔值。

   override func touchesBegan(_ touches: Set<UITouch>,with event: UIEvent?){

            if (event?.allTouches?.count)! > 2 {
                numberOfAllTouchesLessThanOrEqualsToTwo = false
            }else{
                numberOfAllTouchesLessThanOrEqualsToTwo = true
            }

        }

    override func touchesMoved(_ touches: Set<UITouch>, with event: UIEvent?) {

            if (event?.allTouches?.count)! > 2 {
                numberOfAllTouchesLessThanOrEqualsToTwo = false
            }else{
                numberOfAllTouchesLessThanOrEqualsToTwo = true
            }

        }

    override func touchesEnded(_ touches: Set<UITouch>, with event: UIEvent?) {

            if (event?.allTouches?.count)! > 2 {
                numberOfAllTouchesLessThanOrEqualsToTwo = false
            }else{
                numberOfAllTouchesLessThanOrEqualsToTwo = true
            }
        }

并且我使用了此布尔型内部手势识别器。

@objc func pinch(pinchGesture: UIPinchGestureRecognizer){

     if pinchGesture.state == UIGestureRecognizerState.changed {
          if numberOfAllTouchesLessThanOrEqualsToTwo {
            //code
          }
      }
 }

有效。