Premièrement, la réponse de Kendall du 10 juillet est pertinente.
Maintenant ... J'ai voulu faire quelque chose de similaire (dans l'iPhone OS 3.0+), mais dans mon cas, je voulais que cela s'applique à l'ensemble de l'application afin de pouvoir alerter les utilisateurs. divers des parties de l'application lorsqu'une secousse s'est produite. Voici ce que j'ai fini par faire.
D'abord, j'ai sous-classé UIWindow . C'est facile. Créez un nouveau fichier de classe avec une interface telle que MotionWindow : UIWindow
(n'hésitez pas à choisir les vôtres, bien sûr). Ajoutez une méthode comme ceci :
- (void)motionEnded:(UIEventSubtype)motion withEvent:(UIEvent *)event {
if (event.type == UIEventTypeMotion && event.subtype == UIEventSubtypeMotionShake) {
[[NSNotificationCenter defaultCenter] postNotificationName:@"DeviceShaken" object:self];
}
}
Changement @"DeviceShaken"
au nom de la notification de votre choix. Sauvegardez le fichier.
Maintenant, si vous utilisez un MainWindow.xib (le modèle standard de Xcode), allez-y et changez la classe de votre objet Window de la manière suivante UIWindow a MotionWindow ou quel que soit le nom que vous lui donnez. Enregistrez le xib. Si vous avez configuré UIWindow de manière programmatique, utilisez votre nouvelle classe Window à la place.
Maintenant, votre application utilise le système spécialisé UIWindow classe. Partout où vous voulez être informé d'un shake, inscrivez-vous aux notifications ! Comme ça :
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(deviceShaken) name:@"DeviceShaken" object:nil];
Se retirer en tant qu'observateur :
[[NSNotificationCenter defaultCenter] removeObserver:self];
J'ai mis le mien dans viewWillAppear : y viewWillDisappear : où les contrôleurs de vue sont concernés. Veillez à ce que votre réponse à l'événement de secousse sache si elle est "déjà en cours" ou non. Sinon, si l'appareil est secoué deux fois de suite, vous aurez un petit embouteillage. De cette façon, vous pouvez ignorer les autres notifications jusqu'à ce que vous ayez vraiment fini de répondre à la notification initiale.
Aussi : Vous pouvez choisir de faire un signal à partir de motionBegan vs. motionEnded . C'est vous qui décidez. Dans mon cas, l'effet doit toujours se produire après l'appareil est au repos (par opposition au moment où il commence à trembler), j'utilise donc motionEnded . Essayez les deux et voyez lequel a le plus de sens ... ou détectez/notifiez pour les deux !
Une autre observation (curieuse ?) ici : Remarquez qu'il n'y a aucun signe de gestion du premier répondant dans ce code. Pour l'instant, je n'ai essayé qu'avec des contrôleurs de vue de tableau et tout semble fonctionner parfaitement ensemble ! Je ne peux cependant pas me porter garant pour d'autres scénarios.
Kendall, et. al - quelqu'un peut-il expliquer pourquoi il en est ainsi pour UIWindow sous-classes ? Est-ce parce que la fenêtre est au sommet de la chaîne alimentaire ?