2010-10-14 8 views
45

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 desvía por encima o por debajo del marco del objeto en el eje Y, quiero terminar el toque.¿Cómo puedo decirle a un UIGestureRecognizer que cancele un toque existente?

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. Voltear la propiedad del reconocedor cancelsTouchesInView no parece hacer lo que quiero.

Gracias!

Respuesta

139

Este pequeño truco funciona para mí.

@implementation UIGestureRecognizer (Cancel) 

- (void)cancel { 
    self.enabled = NO; 
    self.enabled = YES; 
} 

@end 

De la documentación UIGestureRecognizer @enabled:

desactiva un gesto reconocedores por lo que no recibe toques. El valor predeterminado es SÍ. Si cambia esta propiedad a NO mientras un reconocedor de gesto está reconociendo actualmente un gesto , el reconocedor de gestos pasa a un estado cancelado.

+2

OP parece estar preguntando por la cancelación de un individuo tocar dentro del gesto, no matar el gesto por completo. –

+0

Buena solución mínima –

+1

Esta técnica se recomienda en [WWDC 2014 Session 235: Avanzadas Scrollviews y técnicas de manipulación táctil] (https://developer.apple.com/videos/wwdc/2014/?id=235). –

1

Usted tiene un par de maneras de manejar este:

  1. Si estuviera escribiendo una bandeja personalizada gesto reconocedor subclase, fácilmente se podría hacer esto llamando -ignoreTouch:withEvent: desde el interior del reconocedor cuando note que desviarse del área que te importa

  2. Dado que está utilizando el reconocedor Pan estándar, y el toque comienza OK (lo que no quiere evitar que con las funciones de delegado), que realmente sólo puede hacer su distinción cuando recibe el acciones de destino del reconocedor. Compruebe el valor Y de los valores de retorno translationInView: o locationInView: y sujételo adecuadamente.

+2

la pregunta es ¿cómo ignoras el reconocedor y pasas los eventos táctiles a otros en su acción? – Jack

3

¿Qué hay de esto desde el apple docs:

@property(nonatomic, getter=isEnabled) BOOL enabled 

desactiva un gesto reconocedores por lo que no recibe toques. El valor predeterminado es SÍ. Si cambia esta propiedad a NO mientras un reconocedor de gestos reconoce actualmente un gesto, el reconocedor de gestos cambia a un estado cancelado.

8

@ matej's answer in Swift.

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

Obj-C:

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

Swift 3:

recognizer.isEnabled = false 
recognizer.isEnabled = true 
0

De acuerdo con la documentación que puede subclase que reconocedor gesto:

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 se puede llamar desde cualquier lugar si

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

Cuestiones relacionadas