События касания распространяются так:
- UIViews отправляются -hitTest: withEvent: рекурсивно, пока какой-то UIView не решит, что касание находится внутри его границ, а не внутри какого-либо подпредставления с поддержкой взаимодействия с пользователем.
- UIWindow отправляет -touchesBegan: withEvent: и друзей в UIView, возвращенный на шаге 1, игнорируя любую иерархию представлений.
Другими словами, -hitTest: withEvent: используется для определения целевого вида касания, после чего целевое представление получает все -туши ...: withEvent: Сообщения. Если вам нужно перехватить жест смахивания, который может начинаться с кнопки UIB, вам придется переопределить -hitTest: withEvent: , чтобы вернуть self .
Но есть проблема с этим подходом. Как только вы это сделаете, ваша кнопка перестанет работать, потому что она не будет получать никаких сообщений -touches ...: withEvent: . Вам придется перенаправлять касания в подпредставления вручную, если только вы не обнаружите жест смахивания. Это серьезная боль в заднице, и она совсем не гарантирована. Вот для чего нужны UIGestureRecognizers.
Другой подход заключается в создании подкласса UIWindow и переопределении -sendEvent: , что может работать лучше в вашем случае.
В любом случае, внимательно прочитайте документацию Обработка событий . Среди других страшных предупреждений говорится:
Классы фреймворка UIKit:
не предназначен для получения прикосновений, которые
не связаны с ними; в программном
термины, это означает, что мнение
свойство объекта UITouch должно
держать ссылку на рамки
объект для того, чтобы прикосновение было
обрабатываются.