2016-04-18 6 views
1

Ich schreibe eine IOS Swift App und möchte eine Unterstützung für das Schütteln des Geräts hinzufügen. Zur Zeit möchte ich eine Nachricht an die Konsole drucken, wenn der Benutzer sein Telefon schüttelt. Ich fand dieses Tutorial http://www.ioscreator.com/tutorials/detect-shake-gesture-ios8-swift und es sieht super einfach aus, aber es gibt eine Sache, die mich stört.Wie kann ich Unterstützung für das Schütteln des iOS-Geräts aus meiner Swift-App erhalten?

Ich möchte es von jeder Ansicht in der App arbeiten, nicht nur eine einzige. Egal, wo sich der Nutzer momentan in der App befindet - er sollte die Shake-Methode aufrufen können. Soll ich dann in jedem Panel die Methode override func motionEnded(motion: UIEventSubtype, withEvent event: UIEvent) { implementieren? Oder gibt es eine Möglichkeit, es einmal zu implementieren und es über die gesamte App zu verteilen?

Antwort

6

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!

+0

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

+0

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. –

+0

Sieht gut aus, kompiliert unter swift 3.0 running ion iOS 10.0.2, tut aber leider nichts, absolut nichts. – user3069232