Tatsächlich gibt es keinen Unterschied zwischen den Status .Cancelled und .Failed. Beides führt dazu, dass die Gestenerkenner die Geste nicht verarbeiten können. Ich denke, es ist nur eine Namenskonvention.
Obwohl, der Unterschied ist auch, wie beide Zustände die Gestenbehandlung beeinflussen.
Es hängt davon ab, was der vorherige Zustand des Gestenerkennung war.
- Wenn die Gestenerkenner aus
.Possible
zu .Began
in touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent)
(UITouchPhase.Began
Phase der Berührung) übergegangen ist, als in dem gleichen Verfahren zu .Failed
oder .Cancelled
, dem nächsten Gestenerkenner in der Warteschlange (eine Ansicht angebracht) haben die Möglichkeit, mit der Geste umzugehen. Es wird keine Aktionsnachricht gesendet.
- Aber wenn die Gestenerkenner von .Possible zu .Began in
touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent)
(UITouchPhase.Began
Phase der Berührung) übergegangen ist, als in der touchesMoved(touches: Set<UITouch>, withEvent event: UIEvent)
Methode .Failed
oder .Cancelled
die Anerkennung Geste einfach fehlschlagen und wird nichts passieren.Aber die Aktionsnachricht wird trotzdem gesendet.
- Wenn Sie den Code in Zeile 8 auskommentieren, schlägt die Gestenerkennung fehl, und der nächste Gestenerkenner, der an die Ansicht angehängt ist, hat die Möglichkeit, mit der Geste umzugehen.
Also hier der View-Controller:
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")
}
}
und hier ein benutzerdefinierter Gestenerkenner:
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")
}
}
Gerade Kommentar/uncomment den Code auf den Leitungen 8, 10 und 23, die Unterschiede zu sehen .