iOS отключить панорамирование при пролистывании

Я хочу отключить жест панорамирования при смахивании и отключить смахивание, если я выполняю панорамирование, но в итоге я активировал оба режима: панорамирование или смахивание. Есть что-нибудь, что у меня не так?

#pragma mark - UIGestureRecognizerDelegate methods
- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer
{
if ([otherGestureRecognizer isKindOfClass:[UITapGestureRecognizer class]]) {
    [otherGestureRecognizer requireGestureRecognizerToFail:gestureRecognizer];

    NSLog(@"added failure requirement to: %@", otherGestureRecognizer);
}

if ([gestureRecognizer isKindOfClass:[UISwipeGestureRecognizer class]]) {
    [[BTHomeViewController sharedInstance].revealViewController.panGestureRecognizer requireGestureRecognizerToFail:gestureRecognizer];
}

if ([otherGestureRecognizer isKindOfClass:[UIPanGestureRecognizer class]]) {
    [left requireGestureRecognizerToFail:[BTHomeViewController sharedInstance].revealViewController.panGestureRecognizer];
    [right requireGestureRecognizerToFail:[BTHomeViewController sharedInstance].revealViewController.panGestureRecognizer];
}

  return YES;
}

3 ответа

Трудно совместить эти два жеста. Проблема в том, что вы обычно хотите, чтобы жест панорамирования выполнялся мгновенно (что он и делает), но для распознавания жеста смахивания требуется некоторое время, так как пользователь должен перетащить пальцем какой-нибудь путь.

В любом случае есть 2 процедуры, которые вы можете рассмотреть:

Первый - сделать оба жеста узнаваемыми одновременно (что вы уже сделали). То, что вам нужно добавить, это когда распознанный жест смахивает, просто удалите вызовы панорамирования. Для этого все, что вам нужно сделать, это panGesture.enabled = NO; panGesture.enabled = YES; эти 2 строки просто вызываются одна за другой, и жест не сработает, пока не начнется другое касание.

Второй ждет, чтобы увидеть, будет ли распознан. Для этого проще всего заменить жест панорамирования длинным нажатием. Обратите внимание, что жест длинного нажатия действует точно как жест панорамирования, за исключением того, что вы можете установить его соответствующим образом. minimumPressDuration (длительность, которую вы ожидаете, будет проведен удар) и соответствующий allowableMovement который должен быть очень большим в вашем случае.

Я была такая же проблема.

Я много играл с UIGestureRecognizerDelegate, но не повезло.

Что я сделал, так это решил, когда "панорамирование" следует считать "проведением", основываясь на скорости и завершении жеста. Поэтому, если пользователь начинает панорамирование, и скорость меньше определенного значения, продолжайте, если пользователь быстро панорамирует и заканчивает жест, затем запускает "движение".

Это сработало для моих бизнес-требований. Надеюсь, поможет.

Создайте отношения с жестом, чтобы сделать возможным:

panGesture.require(toFail: swipeGesture)
Другие вопросы по тегам