Горизонтальная прокрутка UIScrollView с жестом вертикального панорамирования

StackOverflow https://stackoverflow.com//questions/12694584

Вопрос

Я пытаюсь реализовать UIScrollView, в котором горизонтальное панорамирование прокручивает изображения в виде прокрутки, но вертикальное панорамирование выполняет другое действие, которое у меня есть.Прямо сейчас у меня есть UIScrollView с разбиением на страницы с отключенной вертикальной прокруткой, который отлично работает для прокрутки изображений, но я схожу с ума, пытаясь найти способ перехватывать вертикальные панорамы и вызывать свой собственный метод вместо того, чтобы вертикальные панорамы просто поглощались просмотр прокрутки.я смог сделать

    UIPanGestureRecognizer *panUp = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(handlePanGesture:)];
[self.scrollView addGestureRecognizer:panUp];
[scrollView.panGestureRecognizer setEnabled:NO];

Это дает мне полный контроль над панорамированием в моем handlePanGesture:метод, но это не особенно полезно, потому что тогда я чувствую, что по сути собираюсь переписать всю логику прокрутки, которой я пытаюсь избежать.Любая помощь или рекомендации о том, как этого добиться, будут очень признательны.

Спасибо!

Это было полезно?

Решение

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

    UISwipeGestureRecognizer *swipe = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(handlePanGesture:)];
    swipe.direction = UISwipeGestureRecognizerDirectionDown | UISwipeGestureRecognizerDirectionUp;
    [self.scrollView addGestureRecognizer:swipe];
.

Я проверил это, и он работал нормально, чтобы вызвать обработчик, и вам не нужно отключить распознавание жесткого режима прокрутки (в моем тесте, вид прокрутки был достаточно высоким, а содержание достаточно короткое, чтобы не было достаточно короткоеВертикальная прокрутка - я не знаю, необходимо ли это или нет).

Другие советы

Начиная с iOS 5, UIScrollView раскрывает свою UIPanGestureRecognizer.Установите свои собственные смахивания delegate к self и сделайте жестRecouncer свойством или ivar и приведите свой класс в соответствие с <UIGestureRecognizerDelegate> протокол.Затем реализуйте UIGestureRecognizerDelegateх – gestureRecognizer:shouldRecognizeSimultaneouslyWithGestureRecognizer: вот так:

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer
{
    if ([gestureRecognizer isEqual:self.swipe] && [otherGestureRecognizer isEqual:self.scrollView.panGestureRecognizer])
    {
         return NO;
    }
    return YES; // the default for this method
}

Я добавил UIPanGestureRecognizer затем настройтеgestureRecognizer:shouldRecognizeSimultaneouslyWithGestureRecognizer: так:

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer {
    if ([gestureRecognizer isEqual:self.panGesture] && [otherGestureRecognizer isEqual:self.collectionView.panGestureRecognizer]){
        return YES;
    }
    return NO;
}

Я также добавил отметку gestureRecognizerShouldBegin:

- (BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)gestureRecognizer {
    if ([gestureRecognizer isEqual:self.panGesture]) {
        if (gestureRecognizer.numberOfTouches > 0) {
            CGPoint point = [gestureRecognizer locationOfTouch:0 inView:gestureRecognizer.view];
            CGFloat distX = abs(self.collectionView.lastTouchPos.x - point.x);
            CGFloat distY = abs(self.collectionView.lastTouchPos.y - point.y);
            if (distX > distY) {
                return NO;
            }
        } else {
            return NO;
        }
    }
    return YES;
}

использовать только self.panGesture при панорамировании вверх или вниз.

Обновлять

https://stackoverflow.com/a/8603839/667834 кажется, есть лучший метод для gestureRecognizerShouldBegin

- (BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)gestureRecognizer {
    if ([gestureRecognizer isEqual:self.panGesture]) {
        if (gestureRecognizer.numberOfTouches > 0) {
            CGPoint translation = [self.panGesture velocityInView:self.collectionView];
            return fabs(translation.y) > fabs(translation.x);
        } else {
            return NO;
        }
    }
    return YES;
}
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top