избегайте защемления трех пальцев в UIPinchGestureRecognizer в Swift

Согласно документации Apple, сжатие — это непрерывный жест, который можно использовать двумя пальцами. Даже с зажатием трех пальцев кажется, что в Swift 4.1 все работает нормально.

Я попытался напечатать количество касаний. Даже с тремя пальцами он дает количество касаний как 2. Кажется, он обнаруживает первые 2 касания пальца и игнорирует третий. Так что нет возможности фильтровать.

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

Я вызываю метод setupGesture() в viewDidLoad. Таким образом, он обрабатывает соответствующие жесты пользователя.

func setupGestures(){

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

    }

Есть ли способ избежать защемления трех пальцев в ios?


person Kasun Palihakkara    schedule 14.08.2018    source источник
comment
Что такое pinch в вашем коде? Это не метод делегата... Это обработчик событий? Можете показать, как это называется/связано с созданием GestureRecognizer.   -  person franiis    schedule 14.08.2018
comment
Да, конечно. Отредактировано. Извините за путаницу.   -  person Kasun Palihakkara    schedule 14.08.2018


Ответы (2)


Вы можете фильтровать касания в:

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

Например, получить количество касаний из аргумента touches, а если touches.count > 2, то не действовать на этот жест - игнорировать его.

ИЗМЕНИТЬ(1):

После вашего редактирования у меня появилась другая идея (у меня нет Mac с собой, поэтому я не могу попробовать это прямо сейчас). Попробуйте использовать этот метод из делегата. Вы должны быть в состоянии связаться, прежде чем принять. Я не вижу информации, будет ли это вызываться один раз или по одному на каждое касание (каждый палец). Может быть, вы можете использовать его как-то?

person franiis    schedule 14.08.2018
comment
Кстати, я использую распознаватели жестов (UIPinchGestureRecognizer), а не событие касания. Я пробовал то, что вы предлагали ранее. Но даже с тремя пальцами количество касаний (pinchGesture.numberOfTouches) отображается как 2. Это означает, что он учитывает первые два пальца и игнорирует касание третьего пальца. Таким образом, кажется, что это работает для касания тремя пальцами. - person Kasun Palihakkara; 14.08.2018
comment
@user8028778 user8028778 Пожалуйста, попробуйте мое редактирование. Я не могу проверить это прямо сейчас, но, возможно, это поможет. - person franiis; 14.08.2018
comment
Я тоже пытался использовать этот метод делегата. Но он вызывается до начала касания (как указано в документации Apple). Таким образом,gestRecognizer.numberOfTouches всегда равен нулю, поскольку он вызывается до начала касания. - person Kasun Palihakkara; 14.08.2018
comment
Если это так, вам, возможно, потребуется создать подкласс UIPinchGestureRecognizer и изменить логику в touchesBegin. Я думаю, что изменения будут минимальными, и это не должно быть сложно. Я могу попробовать проверить это через несколько часов, если вы не можете решить это самостоятельно. - person franiis; 14.08.2018
comment
Посмотрите здесь: stackoverflow.com/questions/13982409/three-finger-pinch -жест - person franiis; 14.08.2018
comment
Я придумал способ. Ваши предложения помогают. Заранее спасибо. - person Kasun Palihakkara; 14.08.2018

В последнее время я придумал подход к этой проблеме. Это может быть не лучшее решение или могут быть альтернативы. Но это работает.

Здесь я просто держу логическое значение

 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
          }
      }
 }

Оно работает.

person Kasun Palihakkara    schedule 14.08.2018