Вопрос проверяет понимание того, как UIKit разрешает конфликты между жестами и почему один жест может “перехватывать” другой.
Gesture recognizers конкурируют, анализируя одни и те же touch-события параллельно. UIKit позволяет нескольким жестам находиться в состоянии ожидания, пока не станет ясно, какой из них должен сработать. Победивший жест переводится в состояние recognized, а остальные — в failed. Поведение конкуренции можно настраивать через делегат и зависимости между жестами.
В UIKit жесты не обрабатываются по очереди, а распознаются одновременно. Это фундаментальное отличие от responder chain.
Когда touch-событие попадает в view:
все gesture recognizers, прикреплённые к этой view и её родителям, получают события
каждый жест анализирует их независимо
все жесты изначально находятся в состоянии possible
UIKit не знает заранее, какой жест “правильный”.
Во время распознавания жест проходит через состояния:
possible — жест ещё не распознан
recognized / ended — жест успешно распознан
failed — жест не соответствует паттерну
cancelled — жест был отменён системой
Пока жест в possible, он продолжает конкурировать с другими.
Когда один из gesture recognizers:
уверенно распознаёт свой паттерн
переходит в recognized
UIKit:
уведомляет этот жест
переводит конфликтующие жесты в failed
может отменить touch-события у view
UIPanGestureRecognizer vs UIScrollView
UITapGestureRecognizer vs UIPanGestureRecognizer
Кастомный жест vs системный (back swipe)
Gesture recognizers конкурируют параллельно, а не последовательно. Побеждает тот жест, который первым однозначно распознаёт свой паттерн, если иное не задано правилами.