iOS: отмена касаний UIScrollView при использовании 2 пальцев - PullRequest
4 голосов
/ 10 ноября 2011

Я написал подкласс UIScrollView, который я использую для прокрутки серии UITableView. Смотрите следующую диаграмму:

enter image description here

Как видите, у меня есть несколько вертикально прокручиваемых UITableView, которые прокручиваются горизонтально внутри родительского UIScrollView. Это все отлично работает. Однако в приложении есть несколько жестов global . Например, если я проведу пальцем в указанном направлении двумя пальцами, я сделаю переход UIView к другой части приложения. но если я делаю жест поверх представления прокрутки и / или его дочерних табличных представлений, они естественным образом прокручивают свое содержимое. Это не выглядит хорошо и вызывает некоторые проблемы с макетом.

Я хотел бы выяснить, как отключить всю прокрутку как для UIScrollView, так и для его дочерних UITableView, когда пользователь касается в любом месте двумя пальцами и только двумя пальцами. Я пробовал варианты переопределения касаний Beg, touchesEnded, touchShouldCancel и т. Д., Но я не могу сделать это совершенно правильно. Любая помощь очень ценится.

Вот мой код обработки жестов:

UISwipeGestureRecognizer *twoFingerSwipeUp = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(handleTwoFingerSwipe:)];
[twoFingerSwipeUp setNumberOfTouchesRequired:2];
[twoFingerSwipeUp setDirection:UISwipeGestureRecognizerDirectionUp];
[twoFingerSwipeUp setDelegate:self];

// 'self' is the superview of the UIScrollView, which is a UIView.
[self addGestureRecognizer:twoFingerSwipeUp];

[twoFingerSwipeUp release];

// ... repeat the above code for up, down, left, right gestures ...

- (void)handleTwoFingerSwipe:(UISwipeGestureRecognizer*)swipeGesture {

    switch ([swipeGesture direction]) {

        case UISwipeGestureRecognizerDirectionUp:            
            [self changeToView:viewAbove];
            break;

        case UISwipeGestureRecognizerDirectionDown:
            [self changeToView:viewBelow];            
            break;

        case UISwipeGestureRecognizerDirectionRight:
            [self changeToView:viewToTheRight];
            break;

        case UISwipeGestureRecognizerDirectionLeft:
            [self changeToView:viewToTheLeft];
            break;            
    }
}

Ответы [ 5 ]

1 голос
/ 22 ноября 2011

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

[[scrollView panGestureRecognizer] requireGestureRecognizerToFail: twoFingerRecogniser];

Повторяйте приведенный выше код для каждого представления прокрутки и представления таблицы.

(PS: «распознаватель» - британский английский, а не орфографическая ошибка)

Надеюсь, это поможет.: -)

1 голос
/ 22 ноября 2011

Попробуйте установить panGestureRecognizer.maximumNumberOfTouches = 1 для всех видов прокрутки и таблиц (только для iOS 5).

0 голосов
/ 02 сентября 2012

Просто отключите взаимодействие с пользователем в родительском представлении прокрутки. Вам нужен подкласс UIWindow и переопределить -sendEvent: метод, потому что он вызывается ДО любого распознавателя жестов. Там, если вы обнаружите два касания, отправьте уведомление. Позвольте представлению прокрутки слушать это и отключить взаимодействие с пользователем, если это происходит. И если прикосновения закончились, пусть он снова включит взаимодействие с пользователем.

0 голосов
/ 28 ноября 2011

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

if (swipeGesture.state == UIGestureRecognizerStateEnded) {
   // Do your think
}

Я знал, что странные вещи случаются иначе.

0 голосов
/ 28 ноября 2011

Введите этот код: scrollView.minimumZoomScale = 1.0; scrollView.maximumZoomScale = 1.0;scrollView.delegate self];

А вот метод scrollViewDelegate: -

- (UIView *) viewForZoomingInScrollView: (UIScrollView *) aScrollView {return aScrollView;}

...