0

В чем разница между состояниями .Cancelled и .Failed?UIGestureRecognizerState.Cancelled vs UIGestureRecognizerState.Failed

Как установить состояние распознавателя жестов на .Cancelled или .Failed влияет на сам распознаватель жестов?

Когда состояние распознавателя жеста становится .Cancelled и .Failed?

В этот момент распознаватель признака помечен как «признанный»? После перехода на .Began?

Когда да, может ли состояние жестов установить на .Began в touchesMoved также?

Например, на каком этапе является жест, фиксирующий UIPinchGestureRecognizer? Я предполагаю, что только в touchesMoved, потому что ущемление - это непрерывный жест.

ответ

1

На самом деле нет никакой разницы между состояниями .Cancelled и .Failed. Оба они приводят к тому, что распознаватель жестов не справляется с жестом. Я предполагаю, что это просто соглашение об именах.

Хотя, разница также в том, как оба состояния влияют на обработку жестов.

Это зависит от того, что было в предыдущем состоянии распознавателя жестов.

  1. Если жест распознаватель перешли от .Possible к .Began в touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent) (UITouchPhase.Began фазе на ощупь), чем в том же методе к .Failed или .Cancelled, следующий жест распознаватель в очереди (прилагается к представлению) будет иметь возможность справиться с жестом. Сообщение о каких-либо действиях не будет отправлено.
  2. Но если жест распознаватель переход от .Possible к .Began в touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent) (UITouchPhase.Began фазе на ощупь), чем в touchesMoved(touches: Set<UITouch>, withEvent event: UIEvent) способу .Failed или .Cancelled распознавания жеста просто не будет и ничего не будет.Но сообщение о действии будет отправлено в любом случае.
  3. Если вы закомментируете код в строке 8, распознавание жеста не будет выполнено, и следующий распознаватель жестов, прикрепленный к представлению, будет иметь возможность справиться с жестом.

Так вот контроллер вид:

class ViewController: UIViewController { 

    func panHandler(sender: UIPanGestureRecognizer) { 
     print("panHandler") 
    } 

    override func viewDidLoad() { 
     super.viewDidLoad() 
     // Do any additional setup after loading the view, typically from a nib. 

     let customRecognizer = CustomGestureRecognizer(target: self, action: #selector(ViewController.customHandler(_:))) 
     view.addGestureRecognizer(customRecognizer) 

     let panRecognizer = UIPanGestureRecognizer(target: self, action: #selector(ViewController.panHandler(_:))) 
     view.addGestureRecognizer(panRecognizer) 

    } 

    override func didReceiveMemoryWarning() { 
     super.didReceiveMemoryWarning() 
     // Dispose of any resources that can be recreated. 
    } 

    func customHandler(c: CustomGestureRecognizer) { 
     print("customHandler") 
    } 
} 

и здесь обычай жест распознаватель:

import UIKit 
import UIKit.UIGestureRecognizerSubclass 

class CustomGestureRecognizer: UIGestureRecognizer { 

    override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent) { 
     super.touchesBegan(touches, withEvent: event) 
     state = .Began 
     if touches.count == 1 { 
      //state = .Failed 
     } 
     print("CustomGestureRecognizer.touchesBegan") 
    } 

    override func touchesMoved(touches: Set<UITouch>, withEvent event: UIEvent) { 
     super.touchesMoved(touches, withEvent: event) 

     if state == .Failed { 
      return 
     } 

     if touches.count == 1 { 
      state = .Failed //.Cancelled 
     } 

     state = .Changed 
     print("CustomGestureRecognizer.touchesMoved") 
    } 

    override func touchesEnded(touches: Set<UITouch>, withEvent event: UIEvent) { 
     super.touchesEnded(touches, withEvent: event) 
     state = .Ended 
     print("CustomGestureRecognizer.touchesEnded") 
    } 
} 

Просто комментарий/раскомментировать код на линии 8, 10 и 23, чтобы увидеть различия ,

1

Вот различие между

.Cancelled

жест распознаватель получила штрихи, приводящие к отмене непрерывного жеста. Он отправляет свое сообщение о действии (или сообщениях) в следующий цикл цикла выполнения и сбрасывает его состояние в UIGestureRecognizerStatePossible.

и

.Failed

Этот жест распознаватель получил последовательность мульти-сенсорный, что он не может распознать, как его жест. Сообщение о действии не отправляется, а распознаватель жестов сбрасывается в UIGestureRecognizerStatePossible.

Чтобы перефразировать, .Cancelled вызывается, когда непрерывный жест прерывается. .Failed вызывается, когда жест не распознается как определенный тип жестов.