UILongPressGestureRecognizer est appelé deux fois en appuyant sur

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 la presse longue:

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

Le texte “double oo” est imprimé deux fois lorsque j’appuie pendant plus de 2 secondes. Pourquoi est-ce? Comment puis-je réparer?

UILongPressGestureRecognizer est un identifiant d’événement 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épart ou ne regarder le mouvement que lorsque vous en avez besoin. De la référence de la classe :

Les gestes de presse longue sont continus. Le geste commence (UIGestureRecognizerStateBegan) lorsque le nombre de doigts autorisés (numberOfTouchesRequired) a été appuyé pendant la période spécifiée (minimumPressDuration) et que les touches ne bougent pas au-delà de la plage de mouvement autorisée (allowableMovement). La reconnaissance de geste passe à l’état Modifier chaque fois qu’un doigt se déplace et se termine (UIGestureRecognizerStateEnded) lorsque l’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 } } 

Pour vérifier l’état de UILongPressGestureRecognizer, ajoutez simplement une instruction if sur la méthode de sélecteur:

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

Vous devez vérifier l’état correct, car il existe différents comportements pour chaque état. Vous allez probablement avoir besoin de l’état UIGestureRecognizerStateBegan avec 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 } } 

Essayez ceci:

Objectif 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."); } } 

Voici comment le gérer 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."); } } 

Swift 3.0:

 func handleLongPress(sender: UILongPressGestureRecognizer) { if sender.state == .ended { print("Long press Ended") } else if sender.state == .began { print("Long press detected") } 

votre gestionnaire de gestes reçoit un appel pour chaque état de geste. vous devez donc vérifier chaque état et mettre votre code dans l’état requirejs.

Il faut préférer utiliser le switch-case sur 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; } }