Ответ
Обработка строится на Responder Chain (цепочке ответчиков). При касании система создает объект UIEvent с UITouch и передает его по цепочке:
- Hit-Testing:
UIWindowнаходит самую глубокую вью, получившую касание, с помощью методаhitTest(_:with:). - Цепочка ответчиков: Событие передается от этой вью (
UIView) вверх по иерархии ответчиков (UIResponder):UIView->UIViewController->UIWindow->UIApplication.
Способы обработки:
- Переопределение методов
UIResponder: Прямая обработка в кастомной вью.override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) { super.touchesBegan(touches, with: event) // Логика обработки начала касания } - Использование
UIControl(например,UIButton):- Через
addTarget:button.addTarget(self, action: #selector(handleTap), for: .touchUpInside) - Через
@IBActionв Interface Builder.
- Через
Почему цепочка? Это обеспечивает гибкость: если вью не обработала событие, его может перехватить родитель или контроллер.