UIGestureRecognizer, блокирующий прокрутку табличного представления - PullRequest
7 голосов
/ 21 июля 2010

Я использую собственный подкласс UIGestureRecognizer для отслеживания жестов в моем классе InfoView.Класс InfoView является подвидом пользовательского подкласса UITableViewCell с именем InfoCell.

Я добавил свой распознаватель жестов в свое корневое представление (родительское представление всего остального на экране, потому что цель моего пользовательского распознавателя жестов - разрешить перетаскивание InfoCell представлений между таблицами).Теперь все работает как надо, кроме одного.Я использую следующий код в моем подклассе UIGestureRecognizer для обнаружения касаний в представлении InfoView:

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
    UIView *touchView = [[touches anyObject] view];
    if ([touchView isKindOfClass:[InfoView class]]) {
        // Do stuff
    }

Проблема здесь в том, что касания объекта InfoView перехватываются, поэтомуони не перенаправляются в UITableView, который содержит InfoCell, который является родительским представлением InfoView.Это означает, что я больше не могу прокручивать табличное представление, перетаскивая на InfoView представление, которое является проблемой, потому что InfoView охватывает все InfoCell.

Есть ли способ, которым я могу переслатькасается таблицы, чтобы она могла прокручиваться?Я уже пробовал несколько вещей:

[super touchesBegan:touches withEvent:event];

[touchView.superview.superview touchesBegan:touches withEvent:event]; (touchView.superview.superview получает ссылку на своего родителя UITableView)

Но ничегодо сих пор работал.Кроме того, свойство cancelsTouchesInView моего UIGestureRecognizer установлено на NO, так что это не мешает прикосновениям.

Помощь приветствуется.Спасибо!

Ответы [ 4 ]

25 голосов
/ 29 октября 2010

Проверьте метод UIGestureRecognizerDelegate: - (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer

Если это вернет ДА, это предотвратит использование вашего распознавателя жестов на том, который UIScrollView использует для обнаружения прокрутки.

9 голосов
/ 30 июля 2010

UIGestureRecognizer имеет свойство "cancellsTouchesInView", которое по умолчанию установлено в YES. Это означает, что касания в UIView отменяются при распознавании жеста. Попробуйте установить его в NO, чтобы позволить UIScrollView получать дальнейшие сенсорные события.

3 голосов
/ 28 августа 2013

Вы можете попробовать добавить это уведомление

- (BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)gestureRecognizer {
    if ([gestureRecognizer class] == [UIPanGestureRecognizer class]) {
        UIPanGestureRecognizer *panGestureRec = (UIPanGestureRecognizer *)gestureRecognizer;
        CGPoint point = [panGestureRec velocityInView:self];
        if (fabsf(point.x) > fabsf(point.y) ) {
            return YES;
        }
    }
    return NO;
}
3 голосов
/ 21 июля 2010

В моем методе touchesBegan была строка, в которой для свойства state распознавателя жестов установлено значение UIGestureRecognizerStateBegan.Удаление этой строки, похоже, решает проблему.

...