O UILongPressGestureRecognizer é chamado duas vezes ao pressionar

Estou detectando se o usuário pressionou por dois segundos:

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

É assim que eu lido com a imprensa longa:

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

O texto “oo duplo” é impresso duas vezes quando pressiono por mais de 2 segundos. Por que é isso? Como posso consertar?

O UILongPressGestureRecognizer é um reconhecedor de events contínuo. Você tem que olhar para o estado para ver se este é o início, meio ou fim do evento e agir de acordo. isto é, você pode jogar fora todos os events após o início, ou apenas observar o movimento que você precisar. A partir da referência de class :

Os gestos de longa pressão são contínuos. O gesto começa (UIGestureRecognizerStateBegan) quando o número de dedos permitidos (numberOfTouchesRequired) foi pressionado pelo período especificado (minimumPressDuration) e os toques não se movem além da faixa de movimento permitida (allowableMovement). O reconhecedor de gestos transita para o estado Alterar sempre que um dedo se move e termina (UIGestureRecognizerStateEnded) quando qualquer um dos dedos é levantado.

Agora você pode acompanhar o estado como este

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

Para verificar o estado do UILongPressGestureRecognizer, basta adicionar uma declaração if no método seletor:

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

Você precisa verificar o estado correto, pois existem comportamentos diferentes para cada estado. Muito provavelmente, você precisará do estado UIGestureRecognizerStateBegan com o 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 } } 

Apenas tente isto:

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

Veja como lidar com isso no 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") } 

seu manipulador de gestos recebe uma chamada para cada estado de gesto. então você precisa colocar um cheque para cada estado e colocar seu código no estado requerido.

É preciso preferir usar o caso de alternância sobre 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; } }