Zunächst einmal kann herausfinden, wo diese ‚Bewegung‘ Methoden kommen, wie docs sagen:
Die UIResponder Klasse eine Schnittstelle für Objekte definiert, die zu reagieren und Ereignisse behandeln. Es ist die Super UIApplication, UIView und ihre Unterklassen .. (https://developer.apple.com/library/ios/documentation/UIKit/Reference/UIResponder_Class/)
Die Ereignisbehandlungsmethoden für Bewegungsereignisse sind:
func motionBegan(motion: UIEventSubtype, withEvent event: UIEvent?)
func motionCancelled(motion: UIEventSubtype, withEvent event: UIEvent?)
func motionEnded(motion: UIEventSubtype, withEvent event: UIEvent?)
So, wie Sie sehen, zu ‚fangen‘ Bewegungsereignisse auf Jeder Bildschirm der App - wir sollten diese Methoden in diesen Bildschirmen überschreiben. Gott sei Dank, mit Erweiterungen - wir können es viel einfacher machen :)
Um incapculate ‚Bewegung‘ Logik lässt ein Protokoll machen und nennen es ‚MotionDelegate‘:
protocol MotionDelegate {
func motionBegan(motion: UIEventSubtype, withEvent event: UIEvent?)
func motionCancelled(motion: UIEventSubtype, withEvent event: UIEvent?)
func motionEnded(motion: UIEventSubtype, withEvent event: UIEvent?)
}
Und eine machen Erweiterung von UIViewController, konformen MotionDelegate Protokoll:
extension UIViewController:MotionDelegate {
override public func becomeFirstResponder() -> Bool {
return true
}
override public func motionBegan(motion: UIEventSubtype, withEvent event: UIEvent?) {
if motion == .MotionShake { print("Shaking motionBegan with event\(event)") }
}
override public func motionCancelled(motion: UIEventSubtype, withEvent event: UIEvent?) {
if motion == .MotionShake { print("Shaking motionCancelled with event\(event)") }
}
override public func motionEnded(motion: UIEventSubtype, withEvent event: UIEvent?) {
if motion == .MotionShake { print("Shaking motionEnded with event\(event)") }
}
}
Auf diese Weise arbeitet die Bewegungsverarbeitung an JEDEN UIViewController-Instanzen Ihrer Anwendung.
Um Bewegungsereignis auf einigen bestimmten vc zu behandeln Ihre es in seiner Ausdehnung außer Kraft setzen sollte:
extension MotionViewController {
override func motionEnded(motion: UIEventSubtype, withEvent event: UIEvent?) {
if motion == .MotionShake {
print("MotionViewController Shaking motionEnded with event\(event)")
}
}
}
Hoffe, es hilft!
Vielen Dank, es hilft sehr! Nur zwei kleine Fragen - soll ich dieses Protokoll in eine komplett neue und getrennte Datei schreiben? Das Gleiche mit der Erweiterung - wo genau kann ich es sagen? – user3766930
Es ist nicht wirklich wichtig, aber es ist eine gute Möglichkeit, Dateien zu logischen Teilen zu trennen, so würde ich empfehlen, Protokoll und VC-Erweiterung in neue Datei zu implementieren. –
Sieht gut aus, kompiliert unter swift 3.0 running ion iOS 10.0.2, tut aber leider nichts, absolut nichts. – user3069232