Что такое UIGestureRecognizer в UIKit?

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

Ответ

UIGestureRecognizer — это абстрактный базовый класс в UIKit, который инкапсулирует логику распознавания конкретного жеста (тап, свайп, пинч). Он добавляется к UIView и уведомляет целевой объект при распознавании жеста, избавляя от необходимости обрабатывать низкоуровневые touch-события вручную.

Основные подклассы (конкретные распознаватели):

  • UITapGestureRecognizer — Одно или несколько касаний.
  • UIPanGestureRecognizer — Перетаскивание (panning).
  • UIPinchGestureRecognizer — Сведение/разведение пальцев (масштабирование).
  • UIRotationGestureRecognizer — Вращение двумя пальцами.
  • UISwipeGestureRecognizer — Быстрый свайп в определённом направлении.
  • UILongPressGestureRecognizer — Долгое нажатие.

Пример добавления обработчика тапа:

let tapRecognizer = UITapGestureRecognizer(target: self, action: #selector(handleTap(_:)))
tapRecognizer.numberOfTapsRequired = 1 // Одинарный тап
tapRecognizer.numberOfTouchesRequired = 1 // Одним пальцем
myView.addGestureRecognizer(tapRecognizer)

@objc func handleTap(_ sender: UITapGestureRecognizer) {
    let location = sender.location(in: sender.view)
    print("Тап распознан в точке: (location)")
}

Дополнительные возможности:

  • Состояние жеста: Распознаватель проходит через состояния (.began, .changed, .ended, .cancelled), что полезно для непрерывных жестов (pan, pinch).
  • UIGestureRecognizerDelegate: Позволяет тонко управлять поведением (одновременное распознавание нескольких жестов, условие начала распознавания).
  • Зависимости жестов: Можно сделать так, чтобы один жест требовал неудачи другого (require(toFail:)).