Как остановить UIPanGestureRecognizer при перемещении объекта в определенный кадр

#iphone #objective-c #ipad #uigesturerecognizer #uipangesturerecognizer

#iPhone #objective-c #iPad #uigesturerecognizer #uipangesturerecognizer

Вопрос:

У меня есть объект типа изображения, который я перемещаю с помощью UIPanGestureRecognizer, и мне нужно прекратить распознавание UIPanGestureRecognizer, когда объект достигает определенного кадра.

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

}
  

Как я могу это сделать?

Ответ №1:

UIGestureRecognizers имеют свойство enabled. Документация:

Отключает распознаватель жестов, чтобы он не получал касания. Значение по умолчанию — ДА. Если вы измените это свойство на NO, в то время как средство распознавания жестов в данный момент распознает жест, средство распознавания жестов перейдет в состояние отмены.

Редактировать:

Просто установите для свойства enabled значение NO.

 gestureRecognizer.enabled = NO;
  

Комментарии:

1. Привет, jbat. Можете ли вы дать мне какой-нибудь пример кода строки для этого. для остановки UIGestureRecognizers

Ответ №2:

Когда вам нужно запретить вашему UIPanGestureRecognizer распознавать жесты, вы просто помещаете эту строку кода (как сказал jbat100) в -(void)move:(UIPanGestureRecognizer *)gestureRecognizer :

 gestureRecognizer.enabled = NO;
  

после этой строки состояние вашего GestureRecognizer устанавливается как "UIGestureRecognizerStateCancelled"

затем просто добавьте пару строк в свою -(void)move:(UIPanGestureRecognizer *)gestureRecognizer функцию:

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

и вы сможете работать с вашим распознавателем жестов

Редактировать:

Вот фрагмент кода:

 - (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. Ответ не имеет смысла, где именно gestureRecognizer.enabled = YES; должен быть написан. Если вы можете уточнить, это имело бы гораздо больше смысла.

2. Мне это нравится. Это сохраняет состояние распознавателя, инкапсулированное в эту функцию, вместо того, чтобы помещать глупые shouldCancelPan переменные экземпляра в ваш код.

3. используя этот метод, когда я достигаю определенной точки и устанавливаю recogniser.enabled = false, он переходит в отмененное состояние, в котором я снова включаю его, но жест не запускается, пока я не подниму палец и не начну снова.

Ответ №3:

Установите pangesture.delegate=self и реализуйте метод делегирования

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