Противоречивость UITapGestureRecognizer в UIView и для UITableView - PullRequest
23 голосов
/ 18 января 2012

У меня есть UIView, в который я добавил UITapGestureRecognizer. Внутри этого представления у меня также есть подпредставление, в котором, по сути, что-то вроде UITableView. Вопрос в том, почему UITableView не распознает нажатие на строку, а вместо этого все время обращается к обработчику распознавания жеста. Почему это и как мне это решить? Если я установлю количество нажатий 2, то все будет работать нормально. Есть идеи, как это решить? В основном это не вызывает didSelectRowAtIndexPath.

Ответы [ 2 ]

55 голосов
/ 18 января 2012

Установите cancelsTouchesInView вашего распознавателя на NO. В противном случае он «потребляет» касание для себя и не передает его в табличное представление. Вот почему событие выбора никогда не происходит.

26 голосов
/ 18 января 2012

Если вы хотите, чтобы оба ваши UITableView и ваши UITapGestureRecognizer принимали события касания, тогда да, cancelsTouchesInView = NO будет работать.Если вы хотите, чтобы распознаватель жестов касания не получал события касания, предназначенные для табличного представления, это немного менее просто, но очень выполнимо.

В основном, когда вы создаете распознаватель жестов, вы устанавливаете self в качестве его делегата.Затем вы реализуете метод делегата gestureRecognizer:shouldReceiveTouch:.Базовая реализация может выглядеть следующим образом.

-(BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch{
    UITableView *tableView = self.tableView;
    CGPoint touchPoint = [touch locationInView:tableView];
    return ![tableView hitTest:touchPoint withEvent:nil];
}

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...