388 votes

UILongPressGestureRecognizer est appelé deux fois lorsque l'on appuie sur le bouton.

Je détecte si l'utilisateur a appuyé pendant 2 secondes :

UILongPressGestureRecognizer *longPress = [[UILongPressGestureRecognizer alloc]
                                             initWithTarget:self 
                                             action:@selector(handleLongPress:)];
        longPress.minimumPressDuration = 2.0;
        [self addGestureRecognizer:longPress];
        [longPress release];

C'est comme ça que je gère la presse longue :

-(void)handleLongPress:(UILongPressGestureRecognizer*)recognizer{
    NSLog(@"double oo");
}

Le texte "double oo" est imprimé deux fois lorsque j'appuie sur la touche pendant plus de 2 secondes. Comment cela se fait-il ? Comment puis-je le réparer ?

731voto

joelm Points 3570

UILongPressGestureRecognizer est une reconnaissance d'événements continus. Vous devez regarder l'état pour voir si c'est le début, le milieu ou la fin de l'événement et agir en conséquence. C'est-à-dire que vous pouvez jeter tous les événements après le début, ou ne regarder que les mouvements dont vous avez besoin. A partir du Référence de la classe :

Les gestes d'appui long sont continus. Le geste commence (UIGestureRecognizerStateBegan) lorsque le nombre de doigts autorisé (numberOfTouchesRequired) a été pressé pendant la période spécifiée (minimumPressDuration) et que les touches ne se déplacent pas au-delà de la plage de mouvement autorisée (allowableMovement). La fonction de reconnaissance des gestes passe à l'état Change chaque fois qu'un doigt bouge, et se termine (UIGestureRecognizerStateEnded) lorsque l'un des doigts est soulevé.

Maintenant vous pouvez suivre l'état comme ceci

-  (void)handleLongPress:(UILongPressGestureRecognizer*)sender { 
    if (sender.state == UIGestureRecognizerStateEnded) {
      NSLog(@"UIGestureRecognizerStateEnded");
    //Do Whatever You want on End of Gesture
     }
    else if (sender.state == UIGestureRecognizerStateBegan){
       NSLog(@"UIGestureRecognizerStateBegan.");
   //Do Whatever You want on Began of Gesture
     }
  }

4 votes

La réponse suivante montre comment faire, mais j'ai donné le +1 à cette réponse en raison de son explication détaillée et du lien vers la documentation.

2 votes

Un exemple de code pourrait être plus utile, plutôt qu'un simple lien vers la documentation. J'ai posté mon extrait de code ci-dessous. Vérifiez l'état UIGestureRecognizerStateBegan.

0 votes

UIGestureRecognizerStateChanged

123voto

Dan Points 893

Pour vérifier l'état de UILongPressGestureRecognizer, il suffit d'ajouter une instruction if à la méthode du sélecteur :

- (void)handleLongPress:(UILongPressGestureRecognizer *)sender {    
    if (sender.state == UIGestureRecognizerStateEnded) {
        NSLog(@"Long press Ended");
    } else if (sender.state == UIGestureRecognizerStateBegan) {
        NSLog(@"Long press detected.");
    }
}

13 votes

Vous ne voulez pas de ce bloc if/else, car il y a plus d'états que d'exécutions. "Long press detected" s'imprimera plusieurs fois lorsque l'état change. Vérifiez plutôt l'état UIGestureRecognizerStateBegan.

2 votes

Quelqu'un devrait vraiment modifier cette réponse pour qu'elle corresponde à ce que dit le commentaire du haut. En l'état actuel, le code fourni ne fonctionne pas.

87voto

Paul Solt Points 2641

Vous devez vérifier le bon état, car il existe des comportements différents pour chaque état. Le plus souvent, vous aurez besoin de la fonction UIGestureRecognizerStateBegan avec le UILongPressGestureRecognizer .

UILongPressGestureRecognizer *longPress = [[UILongPressGestureRecognizer alloc]
                                             initWithTarget:self 
                                             action:@selector(handleLongPress:)];
longPress.minimumPressDuration = 1.0;
[myView addGestureRecognizer:longPress];
[longPress release];

...

- (void)handleLongPress:(UILongPressGestureRecognizer *)gesture {
    if(UIGestureRecognizerStateBegan == gesture.state) {
        // Called on start of gesture, do work here
    }

    if(UIGestureRecognizerStateChanged == gesture.state) {
        // Do repeated work here (repeats continuously) while finger is down
    }

    if(UIGestureRecognizerStateEnded == gesture.state) {
        // Do end work here when finger is lifted
    }
}

2 votes

Il semble qu'il faille bouger les doigts pour que l'état change, est-ce exact ?

0 votes

Il pourrait déclencher le StateChanged en déplaçant les doigts, cela ressemble à ce que je faisais dans mon code de test.

1 votes

UIGestureRecognizerStateBegan semble n'être appelé qu'une seule fois, ce qui est parfait pour ma situation, à savoir l'affichage d'une boîte de dialogue lors de la détection d'une pression longue sur un bouton. Les autres états sont appelés plusieurs fois. Merci pour votre aide.

14voto

Raj Points 955

Voici comment le gérer en Swift :

func longPress(sender:UILongPressGestureRecognizer!) {

        if (sender.state == UIGestureRecognizerState.Ended) {
            println("Long press Ended");
        } else if (sender.state == UIGestureRecognizerState.Began) {
            println("Long press detected.");
        }
}

7voto

pankaj wadhwa Points 78

Votre gestionnaire de geste reçoit un appel pour chaque état du geste. vous devez donc mettre une vérification pour chaque état et mettre votre code dans l'état requis.

Il faut préférer l'utilisation du switch-case à celle du if-else :

UILongPressGestureRecognizer *longPress = [[UILongPressGestureRecognizer alloc]
                                         initWithTarget:self 
                                         action:@selector(handleLongPress:)];
    longPress.minimumPressDuration = 1.0;
    [myView addGestureRecognizer:longPress];
    [longPress release];

-(void)handleLongPress:(UILongPressGestureRecognizer *)gesture {
        switch(gesture.state){
          case UIGestureRecognizerStateBegan:
               NSLog(@"State Began");
               break;
          case UIGestureRecognizerStateChanged:
               NSLog(@"State changed");
               break;
          case UIGestureRecognizerStateEnded:
               NSLog(@"State End");
               break;
          default:
               break;
         }
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X