Что такое GestureRecognizer? Какие они бывают?ios-81

Что это?

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

Основные типы Gesture Recognizers

1. UITapGestureRecognizer

  • Распознает: Одиночные или множественные нажатия
  • Конфигурация:
    • numberOfTapsRequired (по умолчанию 1)
    • numberOfTouchesRequired (количество пальцев)
let tapRecognizer = UITapGestureRecognizer(target: self, action: #selector(handleTap))
tapRecognizer.numberOfTapsRequired = 2
view.addGestureRecognizer(tapRecognizer)

2. UIPinchGestureRecognizer

  • Распознает: Сведение/разведение пальцев (масштабирование)
  • Полезные свойства:
    • scale (текущий масштаб)
    • velocity (скорость жеста)

3. UIRotationGestureRecognizer

  • Распознает: Вращение двумя пальцами
  • Полезные свойства:
    • rotation (угол в радианах)
    • velocity (скорость вращения)

4. UISwipeGestureRecognizer

  • Распознает: Свайпы в определенном направлении
  • Конфигурация:
    • direction (up/down/left/right)
    • numberOfTouchesRequired
let swipeRecognizer = UISwipeGestureRecognizer(target: self, action: #selector(handleSwipe))
swipeRecognizer.direction = .left
view.addGestureRecognizer(swipeRecognizer)

5. UIPanGestureRecognizer

  • Распознает: Перетаскивание (drag)
  • Полезные методы:
    • translation(in:) (смещение относительно точки)
    • velocity(in:) (скорость движения)

6. UILongPressGestureRecognizer

  • Распознает: Долгое нажатие
  • Конфигурация:
    • minimumPressDuration (по умолчанию 0.5 сек)
    • allowableMovement (допустимое смещение)

Особые возможности

1. Одновременное распознавание

  • Делегат UIGestureRecognizerDelegate
  • Метод gestureRecognizer(_:shouldRecognizeSimultaneouslyWith:)
func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer,
                      shouldRecognizeSimultaneouslyWith otherGestureRecognizer: UIGestureRecognizer) -> Bool {
    return true
}

2. Зависимости между жестами

  • require(toFail:) — отложить распознавание одного жеста до провала другого
singleTapRecognizer.require(toFail: doubleTapRecognizer)

3. Состояния жестов

  • .possible — готов к распознаванию
  • .began — жест начался
  • .changed — жест изменился (для непрерывных жестов)
  • .ended — жест успешно завершен
  • .cancelled — жест отменен
  • .failed — жест не распознан

Кастомные Gesture Recognizers

Можно создавать свои подклассы для распознавания специализированных жестов:

class CircleGestureRecognizer: UIGestureRecognizer {
    override func touchesMoved(_ touches: Set<UITouch>, with event: UIEvent?) {
        // Логика распознавания кругового жеста
    }
}

Практические советы

  1. Оптимизация производительности:

    • Для сложных жестов уменьшайте cancelsTouchesInView
    • Используйте delaysTouchesBegan/Ended для приоритетной обработки
  2. Лучшие практики:

    • Не добавляйте много распознавателей на одну view
    • Обрабатывайте состояние .ended для подтвержденных жестов
    • Учитывайте state при обработке непрерывных жестов

Резюмируем:

UIGestureRecognizer предоставляет удобный высокоуровневый API для обработки пользовательских жестов. В iOS доступны распознаватели для всех основных типов жестов, поддерживается кастомизация и сложные взаимодействия между жестами. Для нетривиальных сценариев можно создавать собственные подклассы распознавателей.