Ich möchte reagieren, wenn jemand das iPhone schüttelt. Dabei ist es mir egal, wie es geschüttelt wird, sondern nur, dass es für den Bruchteil einer Sekunde heftig geschüttelt wurde. Weiß jemand, wie man das erkennen kann?
Antworten
Zu viele Anzeigen?Es tut mir leid, dies als Antwort und nicht als Kommentar zu posten, aber wie Sie sehen können, bin ich neu bei Stack Overflow und bin daher noch nicht seriös genug, um Kommentare zu posten!
Ich schließe mich @cire an und stelle sicher, dass der First-Responder-Status gesetzt wird, sobald die Ansicht Teil der Ansichtshierarchie ist. So Einstellung ersten Responder-Status in Ihre Ansicht-Controller viewDidLoad
Methode funktioniert zum Beispiel nicht. Und wenn Sie unsicher sind, ob es funktioniert [view becomeFirstResponder]
gibt Ihnen einen booleschen Wert zurück, den Sie testen können.
Ein weiterer Punkt: Sie kann Verwenden Sie einen View-Controller, um das Shake-Ereignis zu erfassen, wenn Sie nicht unnötig eine UIView-Unterklasse erstellen möchten. Ich weiß, es ist nicht so viel Mühe, aber immer noch die Option ist da. Verschieben Sie einfach die Codeschnipsel, die Kendall in die UIView-Subklasse eingefügt hat, in Ihren Controller und senden Sie die becomeFirstResponder
y resignFirstResponder
Nachrichten an self
anstelle der UIView-Unterklasse.
Zunächst einmal weiß ich, dass dies ein alter Beitrag ist, aber er ist immer noch aktuell, und ich habe festgestellt, dass die beiden am häufigsten gewählten Antworten nicht die Erschütterung so früh wie möglich zu erkennen . So wird es gemacht:
- Verknüpfen Sie CoreMotion mit Ihrem Projekt in den Build-Phasen des Ziels:
-
In Ihrem ViewController:
- (BOOL)canBecomeFirstResponder { return YES; } - (void)motionBegan:(UIEventSubtype)motion withEvent:(UIEvent *)event { if (motion == UIEventSubtypeMotionShake) { // Shake detected. } }
Die einfachste Lösung ist die Ableitung eines neuen Root-Fensters für Ihre Anwendung:
@implementation OMGWindow : UIWindow
- (void)motionEnded:(UIEventSubtype)motion withEvent:(UIEvent *)event {
if (event.type == UIEventTypeMotion && motion == UIEventSubtypeMotionShake) {
// via notification or something
}
}
@end
Dann delegieren Sie in Ihrer Anwendung:
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
self.window = [[OMGWindow alloc] initWithFrame:[UIScreen mainScreen].bounds];
//…
}
Wenn Sie ein Storyboard verwenden, kann dies schwieriger sein, da ich den Code, den Sie im Anwendungsdelegat benötigen, nicht genau kenne.
Wenden Sie dazu einfach diese drei Methoden an
- (void)motionBegan:(UIEventSubtype)motion withEvent:(UIEvent *)event{
- (void)motionCancelled:(UIEventSubtype)motion withEvent:(UIEvent *)event{
- (void)motionEnded:(UIEventSubtype)motion withEvent:(UIEvent *)event{
Für Details können Sie einen vollständigen Beispielcode unter dort