Как остановить 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];  

}

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


person user905582    schedule 10.11.2011    source источник


Ответы (3)


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

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

РЕДАКТИРОВАТЬ:

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

gestureRecognizer.enabled = NO;
person jbat100    schedule 10.11.2011
comment
Привет джбат. Можете ли вы дать мне образец кода строки для этого. для остановки UIGestureRecognizers - person user905582; 10.11.2011

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

gestureRecognizer.enabled = NO;

после этой строки ваше состояниеgestRecognizer установлено как "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;
    }
}
person derpoliuk    schedule 31.10.2012
comment
Ответ не имел смысла, где именно gestureRecognizer.enabled = YES; должно быть написано. Если бы вы могли уточнить, было бы гораздо больше смысла. - person rohan-patel; 03.06.2014
comment
Мне это нравится. Он сохраняет состояние распознавателя, инкапсулированное в эту функцию, вместо того, чтобы помещать в код глупые shouldCancelPan переменные экземпляра. - person John Nesbitt; 04.02.2016
comment
используя эту технику, когда я достигаю определенной точки и устанавливаю recogniser.enabled = false, он переходит в состояние отмены, в котором я снова включаю его, но жест не начинается, пока я не подниму палец и не начну снова. - person Pranav Gupta; 15.03.2018

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

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