10

Tengo un objeto de tipo de imagen que estoy moviendo usando UIPanGestureRecognizer, y debo dejar de reconocer el UIPanGestureRecognizer cuando el objeto alcanza un cierto fotograma.Cómo detener UIPanGestureRecognizer cuando el objeto se movió a un determinado fotograma

UIPanGestureRecognizer *panRecognizer = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(move:)]; 
    [panRecognizer setMinimumNumberOfTouches:1]; 
    [panRecognizer setMaximumNumberOfTouches:1]; 
    [panRecognizer setDelegate:self]; 
    [templatePhotoPlaceholderView addGestureRecognizer:panRecognizer]; 

-(void)move:(UIPanGestureRecognizer *)gestureRecognizer 
{ 
    CGPoint translatedPoint = [gestureRecognizer translationInView:templatePhotoPlaceholderView]; 

    if([gestureRecognizer state] == UIGestureRecognizerStateBegan) { 
     _firstX = [imageview center].x; 
     _firstY = [imageview center].y; 
    } 



    translatedPoint = CGPointMake(_firstX+translatedPoint.x, _firstY+translatedPoint.y); 
    //NSLog(@" Move center point :%@", NSStringFromCGPoint(translatedPoint)); 

    [imageview setCenter:translatedPoint]; 

} 

¿Cómo puedo hacer esto?

Respuesta

21

UIGestureRecognizers tiene una propiedad habilitada. Documentación:

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

EDIT:

acaba de establecer la propiedad enabled en NO.

gestureRecognizer.enabled = NO; 
+2

Hi jbat. ¿Me puede dar alguna muestra de código de línea para eso? para detener el UIGestureRecognizers – user905582

8

Cuando tenga que detener su UIPanGestureRecognizer de reconocer gestos, que acaba de poner esta línea de código (como se dijo jbat100) en -(void)move:(UIPanGestureRecognizer *)gestureRecognizer:

gestureRecognizer.enabled = NO; 

después de esta línea su estado gestureRecognizer establece como "UIGestureRecognizerStateCancelled"

, simplemente agregue líneas de par a su función -(void)move:(UIPanGestureRecognizer *)gestureRecognizer:

if ([gestureRecognizer state] == UIGestureRecognizerStateCancelled) { 
    gestureRecognizer.enabled = YES; 
} 

y usted será capaz de trabajar con su gesto reconocedor

EDITAR:

He aquí el fragmento de código:

- (void)move:(UIPanGestureRecognizer *)gestureRecognizer { 
    BOOL cancelPanGesture = YES; 
    if (cancelPanGesture) { 
     /* 
     After this line gesture recognizer will be disabled, state will be UIGestureRecognizerStateCancelled 
     and this method (move:) will fire one more time. 
     */ 
     gestureRecognizer.enabled = NO; 
    } 
    if (gestureRecognizer.state == UIGestureRecognizerStateCancelled) { 
     gestureRecognizer.enabled = YES; 
    } 
} 
+1

La respuesta no tiene sentido donde exactamente 'gestureRecognizer.enabled = YES;' debe escribirse. Si puede elaborar tendría mucho más sentido. –

+0

@ rohan-patel Gracias por sus comentarios, he actualizado mi respuesta. – derpoliuk

+1

Me encanta esto. Mantiene el estado del reconocedor encapsulado en esa función en lugar de poner estúpidas variables de instancia 'shouldCancelPan' en su código. –

3

Ajuste el pangesture.delegate = auto, y poner en práctica el método delegado

- (BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)gestureRecognizer 
{ 
    //return NO when you reach the frame 
} 
Cuestiones relacionadas