Как в UIKit обрабатывается пользовательское касание (тап)?

«Как в UIKit обрабатывается пользовательское касание (тап)?» — вопрос из категории UIKit, который задают на 40% собеседований IOS Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Обработка строится на Responder Chain (цепочке ответчиков). При касании система создает объект UIEvent с UITouch и передает его по цепочке:

  1. Hit-Testing: UIWindow находит самую глубокую вью, получившую касание, с помощью метода hitTest(_:with:).
  2. Цепочка ответчиков: Событие передается от этой вью (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.

Почему цепочка? Это обеспечивает гибкость: если вью не обработала событие, его может перехватить родитель или контроллер.