На самом деле нет никакой разницы между состояниями .Cancelled и .Failed. Оба они приводят к тому, что распознаватель жестов не справляется с жестом. Я предполагаю, что это просто соглашение об именах.
Хотя, разница также в том, как оба состояния влияют на обработку жестов.
Это зависит от того, что было в предыдущем состоянии распознавателя жестов.
- Если жест распознаватель перешли от
.Possible
к .Began
в touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent)
(UITouchPhase.Began
фазе на ощупь), чем в том же методе к .Failed
или .Cancelled
, следующий жест распознаватель в очереди (прилагается к представлению) будет иметь возможность справиться с жестом. Сообщение о каких-либо действиях не будет отправлено.
- Но если жест распознаватель переход от .Possible к .Began в
touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent)
(UITouchPhase.Began
фазе на ощупь), чем в touchesMoved(touches: Set<UITouch>, withEvent event: UIEvent)
способу .Failed
или .Cancelled
распознавания жеста просто не будет и ничего не будет.Но сообщение о действии будет отправлено в любом случае.
- Если вы закомментируете код в строке 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, чтобы увидеть различия ,