How to stop UIPanGestureRecognizer when object moved to certain frame

15,934

Solution 1

UIGestureRecognizers have an enabled property. Documentation:

Disables a gesture recognizers so it does not receive touches. The default value is YES. If you change this property to NO while a gesture recognizer is currently recognizing a gesture, the gesture recognizer transitions to a cancelled state.

EDIT:

Just set the enabled property to NO.

gestureRecognizer.enabled = NO;

Solution 2

When you need to stop your UIPanGestureRecognizer from recognizing gesture, you just put this code line (as jbat100 said) in -(void)move:(UIPanGestureRecognizer *)gestureRecognizer:

gestureRecognizer.enabled = NO;

after this line your gestureRecognizer state set as "UIGestureRecognizerStateCancelled"

then just add couple lines to your -(void)move:(UIPanGestureRecognizer *)gestureRecognizer function:

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

and you'll be able to work with your gesture recognizer

EDIT:

Here's code snippet:

- (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;
    }
}

Solution 3

Set the pangesture.delegate=self, and implement delegate method

- (BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)gestureRecognizer
{
     //return NO when you reach the frame
}
Share:
15,934
user905582
Author by

user905582

Updated on June 04, 2022

Comments

  • user905582
    user905582 almost 2 years

    I have an object of image type which I am moving using UIPanGestureRecognizer, and I need to stop recognizing the UIPanGestureRecognizer when the object reaches a certain 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];  
    
    }
    

    How may I do this ?

  • user905582
    user905582 over 12 years
    Hi jbat. Can you give me some sample of line code for that. for stoping the UIGestureRecognizers
  • rohan-patel
    rohan-patel almost 10 years
    Answer did not make sense where exactly gestureRecognizer.enabled = YES; should be written. If you can elaborate would make much more sense.
  • John Nesbitt
    John Nesbitt about 8 years
    I love this. It keeps the state of the recognizer encapsulated in that function instead of putting stupid shouldCancelPan instance variables in your code.
  • Pranav Gupta
    Pranav Gupta about 6 years
    using this technique when i reach a certain point and set recogniser.enabled = false it moves to a cancelled state wherein i again enable it but the gesture doesent start untill i raise my finger and start again.