2009-12-07 4 views
2

j'ai des questions concernant la détection de tremblement qui a posté ici avant, voici un rappel:détecter shakes un iPhone

« Maintenant ... je voulais faire quelque chose de similaire (dans l'iPhone OS 3.0+), seulement Dans mon cas, je voulais l'appl-wide afin que je puisse alerter les différentes parties de l'application quand un tremblement se produisait Voici ce que j'ai fini par faire

D'abord, j'ai sous-classé UIWindow. avec une interface telle que MotionWindow: UIWindow (n'hésitez pas à choisir la vôtre, natch) 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]; 
    } 
} 

Maintenant, si vous utilisez un MainWindow.xib (stock de template Xcode), allez là-bas et changez la classe de votre objet Window de UIWindow à MotionWindow ou quoi que vous l'appeliez. Sauvegardez le xib. Si vous configurez UIWindow par programme, utilisez plutôt votre nouvelle classe Window.

Maintenant, votre application utilise la classe UIWindow spécialisée. Partout où vous voulez être informé d'un tremblement, inscrivez-vous pour les notifications! Comme ceci:

[[NSNotificationCenter defaultCenter] addObserver:self 
selector:@selector(deviceShaken) name:@"DeviceShaken" object:nil]; 

Pour vous retirer à titre d'observateur:

[[NSNotificationCenter defaultCenter] removeObserver:self]; 

questions:

  1. où mettre les notifications (j'ai vue app base)?
  2. dois-je me retirer en tant qu'observateur, qu'est-ce que cela signifie?
  3. Quelle est l'instruction if que j'utilise pour vérifier si le tremblement s'est accumulé?
  4. Comment puis-je savoir si l'événement Shake sait qu'il est "déjà en cours"?

merci.

+0

Dupliquer http://stackoverflow.com/questions/150446/how-do-i-detect-when-someone-shakes-an-iphone –

Répondre

6

Dans iPhone OS 3.x Il est facile de recevoir des événements de mouvement à partir de n'importe quelle vue définie en tant que premier répondeur.

En vous affichez override de classe la méthode motionEnded:, comme ceci:

- (void)motionEnded:(UIEventSubtype)motion withEvent:(UIEvent *)event 
{ 
    if(motion == UIEventSubtypeMotionShake && [self isViewLoaded]) 
    { 
     //handle shake here... 
    } 
} 

En outre, vous devrez devenir le First Responder lorsque la vue est chargé et apparaît:

- (void)viewDidAppear:(BOOL)animated 
{ 
    [self becomeFirstResponder]; 
    [super viewDidAppear:animated]; 

    //any extra set up code... 
} 

Vous devrez peut-être également répondre à la méthode canBecomeFirstResponder.

- (BOOL)canBecomeFirstResponder 
{ 
    return YES; 
} 

Elles peuvent être utilisées dans n'importe quel objet héritant de la forme UIView.

+0

Je n'ai pas cette méthode dans mon ViewController, il suffit de l'ajouter? voulez-vous effectuer la méthode viewDidLoad? dois-je faire quelque chose dans le xib aussi? – omri

+0

Oui, il suffit de les ajouter à la.m file – rjstelling

+0

Pour une raison quelconque, '- becomeFirstResponder' n'a aucun effet si elle est appelée dans la méthode' - viewDidLoad'. – rjstelling

Questions connexes