У меня есть UIView
, в котором я добавил UITapGestureRecognizer
. Внутри этого представления у меня также есть подвид, в котором в основном есть своего рода UITableView
. Вопрос в том, почему UITableView
не признает крайнюю строку, вместо этого он все время переходит к обработчику распознавателя жестов. Почему это и как я могу это решить? Если я установил количество кранов на 2, то он отлично работает. Любая идея о том, как это решить? В принципе, он не вызывает didSelectRowAtIndexPath
.Конфликт UITapGestureRecognizer в UIView и для UITableView
ответ
Установите cancelsTouchesInView
вашего распознавателя на NO
. В противном случае он «потребляет» прикосновение для себя и не передает его в виде таблицы. Вот почему событие выбора никогда не происходит.
Если вы хотите как ваш 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
«s, и если это произойдет, он будет блокировать жест распознаватель получать прикосновение ... позволяя tableView
чтобы получить прикосновение.
Не могли бы мы сделать это намного проще, изменив строки 3 и 4 на:' CGRect frame = self.tableView.frame; return! CGRectContainsPoint (frame, location); '? – Aufwind
@Aufwind Спасибо, что указали мой слишком сложный код вычисления. Должно быть, я слишком сильно поспешил за этим ответом. 'CGRectContainsPoint()', безусловно, намного лучший способ обработать этот расчет, который я изначально выбрал. Однако я отредактировал свой ответ, чтобы использовать 'hitTest: withEvent:'. Который был бы моим предпочтительным методом по нескольким причинам. Один из них был бы неправильной формы. Если представление было представлено как неправильная форма (например, круг, который обрабатывается только в области круга). Этот случай не был должным образом обработан ручными вычислениями, которые я выполнял. Еще раз спасибо. – NJones
Добро пожаловать. :-) – Aufwind
[Установка этого значения в «НЕТ» дает указание распознавателю доставлять все касания к основному виду, даже если оно распознало последовательность.] (Http://developer.apple.com/library/IOs/#documentation/ UIKit/Reference/UIGestureRecognizer_Class/Reference/Reference.html) – dasblinkenlight
пример кода 'longPressGestureRecognizer.cancelsTouchesInView = NO;' (спасибо dasblinkenlight) – tmr
@dasblinkenlight все еще не работает для меня, я не могу выполнить события касания на моей ячейке просмотра таблицы, я не могу выбрать элементы из ячейки представления таблицы, я использовал 'func tableView (_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) ', но элементы не выбраны. –