UITapGestureRecognizer обнаруживает касание элемента управления только в том случае, если оно коснулось верхней половины элемента управления.

Я пытаюсь реализовать тип «Режим справки» в своем приложении для iOS. Когда пользователь нажимает кнопку справки, прикосновения к экрану перехватываются UITapGestureRecognizer, и если он находится на элементе управления, появляется небольшое всплывающее окно со справочной информацией.

Однако моя проблема заключается в том, что приложение обнаруживает, что я коснулся элемента управления, только если я нажимаю верхнюю половину элемента управления. Я использую hitTest:withEvent: чтобы определить, какое представление было затронуто:

CGPoint touchPoint = [(UITapGestureRecognizer*)sender locationInView:nil];
UIView* touchedView = [self.view hitTest:touchPoint withEvent:nil];

UILabels особенно сложно успешно использовать.

Представление содержит панель навигации вверху, но довольно стандартно. У кого-нибудь была похожая проблема? Кто-нибудь знает решение?


person DanielO    schedule 13.04.2012    source источник


Ответы (1)


Вам нужно получить местоположение касания в вашем представлении, а не в окне (что вы получаете, когда указываете nil в качестве представления).

CGPoint touchPoint = [(UITapGestureRecognizer*)sender locationInView:self.view];
UIView* touchedView = [self.view hitTest:touchPoint withEvent:nil];
person Kurt Revis    schedule 13.04.2012
comment
Спасибо! Не могли бы вы объяснить, почему это частично работает, когда я получаю тач в окне? - person DanielO; 13.04.2012
comment
В этом случае значения y точки неверны из-за некоторого смещения, вероятно, связанного с высотой строки состояния и/или панели навигации. Иногда вам везет, и вы попадаете в правильный вид даже с неправильной точки. - person Kurt Revis; 13.04.2012
comment
У меня та же проблема, что мой UIImageView с UITapRecognizer сообщает о TouchEvents только со второй половины своей высоты, «хотя я использую CGPoint location = [(UITapGestureRecognizer*)sender locationInView:sender.view]; CGPoint touchPoint = [(UITapGestureRecognizer*)sender locationInView:sender]; - person headkit; 20.06.2012