2011-09-07 8 views
5

Tengo una pregunta que puede parecer básica pero que no puede resolver.Método para hacer que UIGestureRecognizer falle después de ser reconocido?

La pregunta básica es: ¿cómo programáticamente pongo un reconocimiento de gestos en estado de falla desde el controlador, mientras está en UIGestureRecognizerStateBegan o UIGestureRecognizerStateChanged?

Explicación más detallada: Tengo un reconocedor de gestos de pulsación larga para UIView dentro de UIScrollView. He hecho

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

porque de lo contrario no puedo obtener la vista de desplazamiento para desplazarse una vez que el usuario coloca el dedo en la vista. Es un toque básico como safari, donde mantienes el dedo hacia abajo en un enlace, que resalta el enlace, pero se desplaza hacia arriba o hacia abajo, luego el enlace no se resalta y la vista de desplazamiento se mueve.

Puedo obtener esto trabajando principalmente ahora ya que ambos gestos están siendo reconocidos, pero sería mejor si puedo detectar movimiento en StateRevitch de gesto de reconocimiento de pulsación larga, y si es más de 20 píxeles más o menos, solo programáticamente falla la pulsación larga.

¿Es esto posible? ¿O estoy cavando en un lugar equivocado?

Respuesta

4

Otra pregunta que me encontré justo después de que envió la pregunta ..

Aquí es lo que hago en el controlador gesto reconocedor ahora:

else if (sender.state == UIGestureRecognizerStateChanged) { 
    CGPoint newTouchPoint = [sender locationInView:[self superview]]; 

    CGFloat dx = newTouchPoint.x - initTouchPoint.x; 
    CGFloat dy = newTouchPoint.y - initTouchPoint.y; 
    if (sqrt(dx*dx + dy*dy) > 25.0) { 
     sender.enabled = NO; 
     sender.enabled = YES; 
    } 
} 

Así que si el dedo se mueve más de 25 píxeles en cualquier dirección , establecer propiedad habilitada en NO hará que el reconocedor falle. ¡Así que esto logrará lo que quiero!

4

Si es un UILongPressGestureRecognizer, simplemente configure su propiedad allowableMovement.

UILongPressGestureRecognizer* recognizer = [your recognizer]; 
recognizer.allowableMovement = 25.0f; 
1

De acuerdo con la documentación que se le subclase 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 se puede 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

Cuestiones relacionadas