UIGestureRecognizer блокирует прокрутку таблицы

Я использую собственный подкласс 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, так что это не мешает прикосновениям.

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


person indragie    schedule 20.07.2010    source источник


Ответы (4)


Ознакомьтесь с методом UIGestureRecognizerDelegate: - (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer

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

person Mark Adams    schedule 29.10.2010
comment
Я бил головой об стену по этому поводу. Спасибо ! :D - person Legolas; 31.08.2012

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

person Felix    schedule 30.07.2010

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

person indragie    schedule 21.07.2010

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

- (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;
}
person user2182192    schedule 28.08.2013
comment
это правильный ответ, запретите запуск panGesture, если жест вертикальный. - person Vassily; 11.04.2014