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

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

Я пытался напечатать количество касаний. Даже с тремя пальцами он дает число касаний, равное 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?

2 ответа

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

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

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

EDIT (1):

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

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

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

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

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

Другие вопросы по тегам