Подтвердить что ты не робот

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

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

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

4b9b3361

Ответ 1

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

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

Ответ 2

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

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

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

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

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

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

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

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

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