Как определить, на какую UIView упало касание
Что проверяют
Понимаете ли вы, как система находит получателя касания, и знаете ли типовые причины, по которым нажатие не срабатывает.
Как отвечать
Обработка идёт в два этапа.
Этап первый: поиск цели. Система обходит иерархию представлений сверху вниз, спрашивая у каждого, попадает ли точка внутрь него, и рекурсивно спускается в подпредставления. Выбирается самое глубокое представление, содержащее точку, оно и становится первым получателем.
Представление исключается из поиска, если у него отключено взаимодействие с пользователем, оно скрыто или его прозрачность близка к нулю. Отсюда типовые причины «кнопка не нажимается»:
- кнопка выходит за границы родителя. Родитель не считает точку своей, и до кнопки поиск просто не доходит. Самая частая причина, и она особенно коварна, потому что визуально всё выглядит нормально;
- у родителя отключено взаимодействие, что автоматически исключает и всех потомков;
- сверху лежит прозрачное представление, перехватывающее касание;
- у представления нулевой размер, хотя содержимое видно за счёт выхода за границы.
Этап второй: цепочка ответчиков. Найденное представление получает событие. Если оно его не обрабатывает, событие идёт вверх по цепочке: к родительскому представлению, затем к контроллеру, затем к окну, приложению и его делегату. Первый, кто обработает, останавливает цепочку.
Эта же цепочка используется не только для касаний: по ней ищется обработчик действия, когда цель не указана явно, и по ней же определяется, кто получает ввод с клавиатуры.
Полезно упомянуть, что распознаватели жестов работают параллельно и имеют приоритет: они могут перехватить последовательность касаний и отменить её обработку представлением.
Если нужно расширить область нажатия, переопределяют проверку попадания точки, а не увеличивают само представление.
Где спотыкаются
Не знают про исключение представлений, выходящих за границы родителя.
Отключают взаимодействие у контейнера и удивляются, что не работают потомки.
Путают поиск цели и передачу события вверх.
Пытаются увеличить область нажатия визуально вместо переопределения проверки попадания.