web-dev-qa-db-fra.com

Reconnaissance de gestes simultanés dans Iphone SDK

J'ai besoin de saisir deux gestes différents en utilisant UISwipeGestureRecognizer (par exemple, UISwipeGestureRecognizerDirectionRight et UISwipeGestureRecognizerDirectionLeft). Lorsque j'ajoute deux méthodes de reconnaissance différentes avec la méthode addGestureRecognizer , seul le dernier outil de reconnaissance ajouté fonctionne. J'ai lu que je devais implémenter gestureRecognizer: shouldRecognizeSimultaneousWithGestureRecognizer: méthode de protocole UIGestureRecognizerDelegate, mais rien ne fonctionne.

Quelqu'un peut-il aider avec un exemple simple d'attraper deux ou plusieurs mêmes gestes? Merci!

25
user294890

La réponse: "Euh, un rapide coup d'œil à la documentation ..." de Phoenix ne fonctionnera absolument pas!

Il définit un masque, puis utilise la même variable pour tester, comme si le dispositif de reconnaissance l'avait effacé et définissait un seul bit. Il stocke, comme il l'a correctement cité dans la documentation:

Les directions autorisées du glissement

sender.direction

retournera simplement le masque que vous avez défini initialement et dans son exemple, ne sera jamais résolu dans une seule direction!

UISwipeGestureRecognizerDirectionRight == 1
UISwipeGestureRecognizerDirectionRight | UISwipeGestureRecognizerDirectionLeft == 3

De plus, dans la plupart des cas, vous n'avez pas besoin de:

  • installer un délégué
  • permettre la reconnaissance simultanée des gestes (à moins que vous ne vouliez des balayages simultanés; peu probable)
  • envoyer la reconnaissance au sélecteur

Ce qui suit fonctionne pour moi:

   UISwipeGestureRecognizer* swipe;

   swipe = [[[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(handleSwipeL)] autorelease];
   swipe.direction = UISwipeGestureRecognizerDirectionLeft;
   [view addGestureRecognizer:swipe];

   swipe = [[[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(handleSwipeR)] autorelease];
   swipe.direction = UISwipeGestureRecognizerDirectionRight; // default
   [view addGestureRecognizer:swipe];
20
ironmonkey

Euh, un rapide coup d'œil à la documentation révélerait que vous faites beaucoup plus de travail que nécessaire:

"direction Les directions autorisées du balayage.

@property(nonatomic) UISwipeGestureRecognizerDirection direction

Discussion Vous pouvez spécifier plusieurs directions en spécifiant plusieurs constantes UISwipeGestureRecognizerDirection à l'aide d'opérandes bit-OU. La direction par défaut est UISwipeGestureRecognizerDirectionRight. "

Ce qui revient à dire qu'au lieu d'utiliser deux UISwipeGestureRecognizers, vous pouvez simplement procéder comme suit:

UISwipeGestureRecognizer *swipeGesture = [[UISwipeGestureRecognizer alloc]
                                      initWithTarget:self action:@selector(handleSwipeGesture:)];

 swipeGesture.direction = UISwipeGestureRecognizerDirectionRight | UISwipeGestureRecognizerDirectionLeft;

Et dans votre méthode d'action:

  -(IBAction)handleSwipeGesture:(UISwipeGestureRecognizer*)sender
     {
     if (sender.direction == UISwipeGestureRecognizerDirectionLeft) {

         //do left action

     } else {

         //do right action

     }
}

Beaucoup plus simple et beaucoup moins sujet aux conflits.

2
Phoenix

Je vous suggérerais de lire un peu la technique utilisée par les reconnaisseurs de geste pour reconnaître le geste. Je suppose que le premier identificateur essaie de reconnaître le geste, mais réalise qu'il n'est pas obligé d'y répondre et qu'il ne le transmet pas d'une manière ou d'une autre.

Il est très utile de lire leur fonctionnement pour comprendre comment les utiliser.

J'espère que cela t'aides.

1
Tomen

Grâce à la suggestion de user294890, j'ai réussi à renvoyer oui à partir des méthodes UIGestureRecognizerDelegate répertoriées. 

J'ai toutefois constaté que cela ne fonctionnerait pas lorsque j'ajoutais le GestureRecognizer avant le chargement de la vue Web. Cela a toutefois fonctionné lorsque j'ai ajouté GestureRecognizer à la WebView dans la méthode de délégation WebView:

- (void)webViewDidFinishLoad:(UIWebView *)webView.

0
rockfakie