recognizer cocoa-touch uigesturerecognizer

cocoa touch - ¿Cómo puedo decirle a UIGestureRecognizer que cancele un toque existente?



tap gesture recognizer swift 4 (6)

¿Qué tal esto de los documentos de Apple :

@property(nonatomic, getter=isEnabled) BOOL enabled

Desactiva los gestores de gestos para que no reciba toques. El valor predeterminado es SÍ. Si cambia esta propiedad a NO mientras un reconocedor de gestos está reconociendo un gesto, el reconocedor de gestos pasa a un estado cancelado.

Tengo un UIPanGestureRecognizer que estoy usando para rastrear un objeto ( UIImageView ) debajo del dedo de un usuario. Solo me importa el movimiento en el eje X, y si el toque se desplaza por encima o por debajo del marco del objeto en el eje Y, quiero finalizar el toque.

Tengo todo lo que necesito para determinar si un toque está dentro de los límites Y del objeto, pero no sé cómo cancelar el evento táctil. Al cancelsTouchesInView propiedad cancelsTouchesInView del reconocedor no parece hacer lo que quiero.

¡Gracias!


De acuerdo a la documentación puedes subclase tu gesto reconocedor:

En YourPanGestureRecognizer.m:

#import "YourPanGestureRecognizer.h" @implementation YourPanGestureRecognizer - (void) cancelGesture { self.state=UIGestureRecognizerStateCancelled; } @end

En YourPanGestureRecognizer.h:

#import <UIKit/UIKit.h> #import <UIKit/UIGestureRecognizerSubclass.h> @interface NPPanGestureRecognizer: UIPanGestureRecognizer - (void) cancelGesture; @end

Ahora puedes llamar si desde cualquier lugar.

YourPanGestureRecognizer *panRecognizer = [[YourPanGestureRecognizer alloc] initWithTarget:self action:@selector(panMoved:)]; [self.view addGestureRecognizer:panRecognizer]; [...] -(void) panMoved:(YourPanGestureRecognizer*)sender { [sender cancelGesture]; // This will be called twice }

Ref: https://developer.apple.com/documentation/uikit/uigesturerecognizer?language=objc


Este pequeño truco me funciona.

@implementation UIGestureRecognizer (Cancel) - (void)cancel { self.enabled = NO; self.enabled = YES; } @end

Desde la documentación de UIGestureRecognizer @enabled :

Desactiva los gestores de gestos para que no reciba toques. El valor predeterminado es SÍ. Si cambia esta propiedad a NO mientras un reconocedor de gestos está reconociendo un gesto, el reconocedor de gestos pasa a un estado cancelado.


La respuesta de @matej en Swift.

extension UIGestureRecognizer { func cancel() { isEnabled = false isEnabled = true } }


Obj-C:

recognizer.enabled = NO; recognizer.enabled = YES;

Swift 3:

recognizer.isEnabled = false recognizer.isEnabled = true


Tienes un par de maneras de manejar esto:

  1. Si estaba escribiendo una subclase de reconocedor de gesto de pan personalizado, podría hacerlo fácilmente llamando a -ignoreTouch:withEvent: desde dentro del reconocedor cuando note que se aleja del área que le interesa.

  2. Ya que está usando el reconocedor de Pan estándar, y el toque comienza con OK (por lo que no quiere evitarlo con las funciones de delegado), realmente solo puede hacer su distinción cuando recibe las acciones de destino del reconocedor. Verifique el valor Y de la translationInView: o locationInView: devuelva los valores, y ajústelos apropiadamente.