recognizer iphone objective-c cocoa-touch gesture-recognition uigesturerecognizer

iphone - UILongPressGestureRecognizer recibe dos llamadas cuando se presiona hacia abajo



tap gesture recognizer swift 4 (7)

Detecto si el usuario ha presionado durante 2 segundos:

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

Así es como manejo la pulsación larga:

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

El texto "doble oo" se imprime dos veces cuando presiono durante más de 2 segundos. ¿Por qué es esto? ¿Cómo puedo arreglarlo?


Solo prueba esto:

C objetivo

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


Aquí está cómo manejarlo 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."); } }


Debe verificar el estado correcto, ya que hay diferentes comportamientos para cada estado. Lo más probable es que necesites el estado UIGestureRecognizerStateBegan con 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 } }


Para verificar el estado del UILongPressGestureRecognizer, simplemente agregue una sentencia if en el método selector:

- (void)handleLongPress:(UILongPressGestureRecognizer *)sender { if (sender.state == UIGestureRecognizerStateEnded) { NSLog(@"Long press Ended"); } else if (sender.state == UIGestureRecognizerStateBegan) { NSLog(@"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") }


UILongPressGestureRecognizer es un reconocedor continuo de eventos. Debe mirar el estado para ver si esto es el inicio, la mitad o el final del evento y actuar en consecuencia. es decir, puede desechar todos los eventos después del inicio, o solo mirar el movimiento que necesite. De la referencia de clase :

Los gestos de larga pulsación son continuos. El gesto comienza (UIGestureRecognizerStateBegan) cuando se presiona el número de dedos permitidos (numberOfTouchesRequired) durante el período especificado (minimumPressDuration) y los toques no se mueven más allá del rango de movimiento permitido (permisible). El reconocedor de gestos pasa al estado de cambio cada vez que se mueve un dedo y finaliza (UIGestureRecognizerStateEnded) cuando se levanta cualquiera de los dedos.

Ahora puedes seguir el estado de esta manera

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


su gestor de gestos recibe una llamada para cada estado de gesto. por lo que necesita poner un cheque para cada estado y poner su código en el estado requerido.

Uno debe preferir usar switch-case over 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; } }