У меня есть UIView
, в который я добавил UITapGestureRecognizer
. Внутри этого представления у меня также есть subview, в котором в основном есть своего рода UITableView
. Вопрос в том, почему не UITableView
распознает нажатие на строку, вместо этого он все время переходит к обработчику распознавателя жестов кран. Почему это и как я могу это решить? Если я установил количество кранов на 2, то он отлично работает. Любая идея о том, как это решить? В принципе, он не вызывает didSelectRowAtIndexPath
.
Конфликт UITapGestureRecognizer в UIView и UITableView
Ответ 1
Установите cancelsTouchesInView
вашего распознавателя на NO
. В противном случае он "потребляет" прикосновение для себя и не передает его в виде таблицы. Вот почему событие выбора никогда не происходит.
Ответ 2
Если вы хотите и использовать UITableView
и свой UITapGestureRecognizer
для получения событий касания, тогда да cancelsTouchesInView = NO
будет работать. Если вы хотите, чтобы распознаватель жестов касания не получал сенсорные события, предназначенные для просмотра таблицы, он немного менее прост, но очень полезен.
В основном, когда вы создаете свой распознаватель жестов, вы устанавливаете себя как его делегата. Затем вы реализуете метод делегата 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
для получения прикосновения.