Передача событий касания к соответствующему родному брату UIViews


12

Я пытаюсь обрабатывать события касания с touchesBegan в оверлее к родительскому UIView, но также позволяет сенсорному вводу перейти к родному брату UIView s снизу. Я ожидал, что будет какой-то прямой способ обработать событие касания, а затем сказать «теперь отправьте его следующему ответчику, как будто этого не было», но все, что я могу найти, это метод , который, как представляется, дает верните родительский элемент в мой оверлейный вид. Затем этот родитель не передает его другому соседнему виду этого оверлея, поэтому я не уверен, как делать то, что кажется простой задачей, которая обычно выполняется с помощью обратного вызова касания, который получает значение True или False, чтобы сообщить об этом следует ли продолжать обрабатывать иерархию виджетов.

Я пропустил что-то очевидное?

3

Поздний ответ, но я думаю, вам было бы лучше переопределить hitTest:withEvent: вместо touchesBegan. Мне кажется, что touchesBegan - это довольно «высокоуровневый» метод, который позволяет просто сделать простую вещь, поэтому вы не можете изменять этот уровень, если событие будет распространено дальше. Правильное место для этого - hitTest:withEvent:.

Также посмотрите на this S.O. answer для получения более подробной информации об этом пункте.


1

Я понимаю желаемое поведение, которое вы ищете Joey. Я не нашел что-то в API, который поддерживает это автоматическое взаимодействие с цепочкой с представлениями для сестер.

То, что я изначально написал ниже, касалось только информирования родителя UIView о касании. Это по-прежнему применяется, но я считаю, что вам нужно сделать еще один шаг вперед, а родительский UIView использует метод тестирования ударов, который Sergio описал в каждом из своих подзонов, которые являются братьями и сестрами, накладываемыми на оверлей, и родительский UIView вручную вызывает «do что-то "на каждом из его подзонов, которые проходят тест попадания. Каждый из этих представлений братьев и сестер может вернуть значение BOOL для того, следует ли прервать информирование других братьев или сестер или продолжить цепочку.

Если вы обнаружите, что используете этот шаблон много, подумайте о добавлении метода категории в UIView, который инкапсулирует тестирование ударов и запросы на просмотр селектора.

Мой Оригинал ответа

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

Вариант 1: Если покрышка не нужно ничего делать, но выглядеть красиво, иметь его отказаться от обработки полностью с userInteractionEnabled = NO ощупь. Это сделает так, чтобы событие касания перешло к его родительскому UIView (к которому он относится).

Вариант 2: Имейте накладку поглотить сенсорный событие (как это было бы по умолчанию), а затем вызвать метод на родительском UIView, указывающего, что прикосновение или определенный жест был распознан, и вот что это такое. Таким образом, UIView позади наложения все равно будет действовать на распознавание касания, даже если кто-то другой перехватил.

С Вариантом 2 он более подходит для простых типов UIControlEvent, таких как UIControlEventTouchDown и UIControlEventTouchUpInside.В моем случае (пользовательский подкласс UIButton с пользовательским надзором поверх него), я подключу сенсорный экран и коснусь событий на кнопке двумя разными способами. Этот огонь, если касание или касание внутри события происходит на самой кнопке. Но они также являются крючками, которые я могу вызывать из представления наложения, если мне нужно имитировать, что нажатие кнопки произошло.

В зависимости от ваших потребностей, вы могли бы иметь известный протокол между накладкой и его родителей UIView или просто покрышка проверить UIView неформально, с respondsToSelector: проверки перед вызовом performSelector: по нему пользовательский метод вы хотите назвать то, что будет автоматически запускаются, если UIView не покрывается наложением.