2012-01-18 5 views
22

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

ответ

54

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

+4

[Установка этого значения в «НЕТ» дает указание распознавателю доставлять все касания к основному виду, даже если оно распознало последовательность.] (Http://developer.apple.com/library/IOs/#documentation/ UIKit/Reference/UIGestureRecognizer_Class/Reference/Reference.html) – dasblinkenlight

+1

пример кода 'longPressGestureRecognizer.cancelsTouchesInView = NO;' (спасибо dasblinkenlight) – tmr

+0

@dasblinkenlight все еще не работает для меня, я не могу выполнить события касания на моей ячейке просмотра таблицы, я не могу выбрать элементы из ячейки представления таблицы, я использовал 'func tableView (_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) ', но элементы не выбраны. –

26

Если вы хотите как ваш 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 чтобы получить прикосновение.

+1

Не могли бы мы сделать это намного проще, изменив строки 3 и 4 на:' CGRect frame = self.tableView.frame; return! CGRectContainsPoint (frame, location); '? – Aufwind

+0

@Aufwind Спасибо, что указали мой слишком сложный код вычисления. Должно быть, я слишком сильно поспешил за этим ответом. 'CGRectContainsPoint()', безусловно, намного лучший способ обработать этот расчет, который я изначально выбрал. Однако я отредактировал свой ответ, чтобы использовать 'hitTest: withEvent:'. Который был бы моим предпочтительным методом по нескольким причинам. Один из них был бы неправильной формы. Если представление было представлено как неправильная форма (например, круг, который обрабатывается только в области круга). Этот случай не был должным образом обработан ручными вычислениями, которые я выполнял. Еще раз спасибо. – NJones

+0

Добро пожаловать. :-) – Aufwind