10

Ho un oggetto di tipo di immagine che mi sto spostando utilizzando UIPanGestureRecognizer e ho bisogno di interrompere il riconoscimento di UIPanGestureRecognizer quando l'oggetto raggiunge un determinato frame.Come arrestare UIPanGestureRecognizer quando l'oggetto è stato spostato su un determinato frame

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]; 

} 

Come posso fare questo?

risposta

21

UIGestureRecognizers hanno una proprietà abilitata. Documentazione:

Disabilita un riconoscimento di gesti in modo che non riceva tocchi. Il valore predefinito è YES. Se si modifica questa proprietà su NO mentre un riconoscitore di movimenti sta riconoscendo un gesto al momento, il movimento di riconoscimento del segnalatore passa a uno stato annullato.

EDIT:

Basta impostare la proprietà permesso di NO.

gestureRecognizer.enabled = NO; 
+2

Ciao jbat. Puoi darmi qualche esempio di codice di linea per questo. per arrestare UIGestureRecognizers – user905582

8

Quando è necessario interrompere l'UIPanGestureRecognizer di riconoscere gesto, basta mettere questa riga di codice (come ha detto jbat100) in -(void)move:(UIPanGestureRecognizer *)gestureRecognizer:

gestureRecognizer.enabled = NO; 

dopo questa riga vostro stato gestureRecognizer impostato come "UIGestureRecognizerStateCancelled"

quindi aggiungi solo alcune linee alla tua funzione -(void)move:(UIPanGestureRecognizer *)gestureRecognizer:

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

e sarete in grado di lavorare con il vostro gesto riconoscitore

EDIT:

Ecco frammento di codice:

- (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 risposta non aveva senso dove esattamente "gestureRecognizer.enabled = YES;" deve essere scritto. Se riesci a elaborare avrebbe molto più senso. –

+0

@ rohan-patel Grazie per il commento, ho aggiornato la mia risposta. – derpoliuk

+1

Amo questo. Mantiene lo stato del riconoscitore incapsulato in quella funzione invece di mettere stupide variabili di istanza 'shouldCancelPan' nel codice. –

3

Impostare la pangesture.delegate = sé, e implementare metodo delegato

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