Работает ли UIGestureRecognizer через цепочку UIResponder?

«Работает ли UIGestureRecognizer через цепочку UIResponder?» — вопрос из категории UIKit, который задают на 10% собеседований IOS Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Да, UIGestureRecognizer интегрирован в систему событий UIResponder, но перехватывает и обрабатывает события касаний до того, как они достигнут стандартных методов UIResponder (таких как touchesBegan(_:with:)).

Последовательность обработки касания:

  1. Система (UIApplication -> UIWindow) отправляет объекты UITouch в цепочку responder'ов.
  2. Прикреплённые к view UIGestureRecognizer анализируют поток касаний.
  3. Если распознаватель определяет свой жест, он:
    • Вызывает свой целевой метод (action).
    • По умолчанию (cancelsTouchesInView = true) отменяет дальнейшую доставку этого касания методам view (touchesBegan и др.).
  4. Если жест не распознан или свойство cancelsTouchesInView = false, события касаний передаются дальше по цепочке UIResponder.

Пример настройки:

let tapRecognizer = UITapGestureRecognizer(target: self, action: #selector(handleTap))
tapRecognizer.cancelsTouchesInView = false // Позволяет touchesBegan также получить событие
view.addGestureRecognizer(tapRecognizer)