web-dev-qa-db-fra.com

UILongPressGestureRecognizer est appelé deux fois lorsque vous appuyez dessus.

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];

Voici comment je gère le long appui:

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

Le texte "double oo" est imprimé deux fois lorsque j'appuie sur cette touche pendant plus de 2 secondes. Pourquoi est-ce? Comment puis-je réparer?

346
Sheehan Alam

UILongPressGestureRecognizer est un outil de reconnaissance d'événements en continu. 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. De la référence de classe :

Les longs gestes sont continus. Le geste commence (UIGestureRecognizerStateBegan) lorsque le nombre de doigts autorisés (numberOfTouchesRequired) a été pressé pendant la période spécifiée (minimumPressDuration) et que les touches ne dépassent pas la plage de mouvement autorisée (allowableMovement). La reconnaissance des gestes passe à l'état Changer à chaque fois qu'un doigt se déplace et se termine (UIGestureRecognizerStateEnded) lorsqu'un des doigts est levé.

Maintenant, vous pouvez suivre l'état comme ça

-  (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
     }
  }
664
joelm

Pour vérifier l'état de UILongPressGestureRecognizer, ajoutez simplement une instruction if sur la méthode selector:

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

Vous devez vérifier le bon état, car il existe différents comportements pour chaque état. Très probablement, vous aurez besoin de l'état 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
    }
}
73
Paul Solt

Essayez ceci:

Objective-C

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

Swift 2.2:

func handleLongPress(sender:UILongPressGestureRecognizer) {

        if (sender.state == UIGestureRecognizerState.Ended) {
            print("Long press Ended");
        } else if (sender.state == UIGestureRecognizerState.Began) {
            print("Long press detected.");
        }
}
18
Rajesh Loganathan

Voici comment gérer cela dans Swift:

func longPress(sender:UILongPressGestureRecognizer!) {

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

Swift 3.0:

func handleLongPress(sender: UILongPressGestureRecognizer) {

    if sender.state == .ended {
        print("Long press Ended")
    } else if sender.state == .began {
        print("Long press detected")
    }
12
fozoglu

votre gestionnaire de geste reçoit un appel pour chaque état de geste. vous devez donc mettre un chèque pour chaque état et mettre votre code dans l'état requis.

Il faut préférer utiliser switch-case plutôt que 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;
         }
}
5
pankaj