recognizer iphone ios uiview uitapgesturerecognizer long-press

iphone - ios tap gesture recognizer



¿iPhone iOS cómo agregar un UILongPressGestureRecognizer y UITapGestureRecognizer al mismo control y evitar conflictos? (5)

Como un enfoque alternativo, no tenga dos reconocedores separados, solo use el reconocedor LongPress para ambos eventos:

Configure de la siguiente manera:

UILongPressGestureRecognizer* longPress = [ [ UILongPressGestureRecognizer alloc ] initWithTarget:self.nextResponder action:@selector(longPressEvent:)]; categoryPanelDrag.minimumPressDuration = 0.0;

Luego maneja de la siguiente manera:

- (BOOL)longPressEvent:(UILongPressGestureRecognizer *)gesture { // _dragStarted is a class-level BOOL if(UIGestureRecognizerStateBegan == gesture.state) { _dragStarted = NO; } if(UIGestureRecognizerStateChanged == gesture.state) { _dragStarted = YES; // Do dragging stuff here } if(UIGestureRecognizerStateEnded == gesture.state) { if (_dragStarted == NO) { // Do tap stuff here } else { // Do drag ended stuff here } } return YES; }

Estoy creando una aplicación para iPhone que permitiría al usuario reorganizar algunos de los elementos de la interfaz de usuario en la pantalla.

¿Cómo puedo agregar un reconocedor de gestos de toques y un reconocedor de gestos de pulsación larga a la misma UIView? Cuando levanto el dedo de la pulsación larga, se dispara el reconocedor de gestos de toque. ¿Cómo puedo desactivar temporalmente el reconocedor de gestos de toque o evitar que se dispare cuando el usuario está presionando prolongadamente?

¡Gracias!


Intenté el enfoque de moby y el oficial, pero de alguna manera no encajaron bien en mi proyecto, así que resolví como a continuación,

-(BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch{ NSLog(@"%@ %ld",touch.description, touch.phase); [self performSelector:@selector(checkTouch:) withObject:touch afterDelay:0.5]; return YES; }

y

- (void)checkTouch:(UITouch *)touch{ NSLog(@"touch phase = %ld",touch.phase); if (touch.phase == UITouchPhaseStationary) { //still holding my hand and this means I wanted longPressTouch } if (touch.phase == UITouchPhaseEnded){ //I released my finger so it''s obviously tap } }

Podría ser una solución más simple pero, por supuesto, depende del proyecto.


Para combinar con éxito ambos necesitas:

1º Agregar a la interfaz del gesto delegado en el encabezado

@interface ViewController : ViewController <UIGestureRecognizerDelegate>

2º Crear eventos de gestos y agregar a una vista en el archivo fuente:

UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(touch:)]; [tap setNumberOfTapsRequired:1]; // Set your own number here [tap setDelegate:self]; // Add the <UIGestureRecognizerDelegate> protocol UILongPressGestureRecognizer *longTap = [[UILongPressGestureRecognizer alloc] initWithTarget:self action:@selector(longTouch:)]; [longTap setNumberOfTapsRequired:0]; // Set your own number here [longTap setMinimumPressDuration:1.0]; [longTap setDelegate:self]; // Add the <UIGestureRecognizerDelegate> protocol [tap requireGestureRecognizerToFail:longTap]; // Priority long [self.view addGestureRecognizer:tap]; [self.view addGestureRecognizer:longTap];

3º Agregar callbacks en el archivo fuente:

- (void) touch: (UITapGestureRecognizer *)recognizer { CGPoint location = [recognizer locationInView: self.HUDview]; if (recognizer.state == UIGestureRecognizerStateBegan) { NSLog(@"touch UIGestureRecognizerStateBegan"); } if (recognizer.state == UIGestureRecognizerStateEnded) { NSLog(@"touch UIGestureRecognizerStateEnded"); //NSLog(@"Position of touch: %.3f, %.3f", location.x, location.y); // Position landscape } } - (void) longTouch: (UILongPressGestureRecognizer *)recognizer { if (recognizer.state == UIGestureRecognizerStateBegan) { NSLog(@"longTouch UIGestureRecognizerStateBegan"); } if (recognizer.state == UIGestureRecognizerStateEnded) { NSLog(@"longTouch UIGestureRecognizerStateEnded"); } }

4º Set reconocedor de gestos disponible:

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer { return YES; }


Para permitir que ambos gestos trabajen juntos, implemente el siguiente método de delegado:

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer{ return YES; }

Para hacer que la pulsación larga tenga prioridad, haga:

[tapGesture requireGestureRecognizerToFail:longPress];


Podría encargarse de eso en el código, que durante la pulsación prolongada, establecer un indicador, y si se llama el toque mientras el indicador es verdadero o lo que sea, entonces no ejecute el código del toque y reinicie el indicador. No se una mejor manera