Ответ
Да, UIGestureRecognizer интегрирован в систему событий UIResponder, но перехватывает и обрабатывает события касаний до того, как они достигнут стандартных методов UIResponder (таких как touchesBegan(_:with:)).
Последовательность обработки касания:
- Система (
UIApplication->UIWindow) отправляет объектыUITouchв цепочку responder'ов. - Прикреплённые к view
UIGestureRecognizerанализируют поток касаний. - Если распознаватель определяет свой жест, он:
- Вызывает свой целевой метод (
action). - По умолчанию (
cancelsTouchesInView = true) отменяет дальнейшую доставку этого касания методам view (touchesBeganи др.).
- Вызывает свой целевой метод (
- Если жест не распознан или свойство
cancelsTouchesInView = false, события касаний передаются дальше по цепочкеUIResponder.
Пример настройки:
let tapRecognizer = UITapGestureRecognizer(target: self, action: #selector(handleTap))
tapRecognizer.cancelsTouchesInView = false // Позволяет touchesBegan также получить событие
view.addGestureRecognizer(tapRecognizer) Ответ 18+ 🔞
Ну, слушай, вот тебе на пальцах, как эта магия с UIGestureRecognizer работает. Представь себе такую картину: у тебя есть view, и на него падает касание, как снег на голову.
Система, эта хитрая жопа, начинает раскидывать это касание по цепочке UIResponder. Но! Пока оно долетит до твоего родного touchesBegan, на его пути стоит наш мудак — UIGestureRecognizer. Он как вышибала в клубе: смотрит на поток касаний и думает — а, это мой жест? Тап? Свайп? Пинч?
И если он свой жест опознал, то он делает две вещи:
- Овердохуища радости и вызывает твой целевой метод (тот самый
action). - И, что самое главное, по умолчанию он говорит системе: «Всё, я тут разобрался, дальше это касание не пускать!». То есть твои
touchesBeganи компания его уже не увидят. Нахуй отменил, короче.
Но если ты хочешь, чтобы и жест работал, и touchesBegan тоже что-то получал — есть волшебная палочка. Называется cancelsTouchesInView. Выставишь её в false, и распознаватель превращается из жадной собаки в вежливого официанта: «Жест я распознал, action вызвал, но, пожалуйста, вот ваши касания, sir, передаю дальше по цепочке».
Вот, смотри, как это в коде выглядит:
let tapRecognizer = UITapGestureRecognizer(target: self, action: #selector(handleTap))
tapRecognizer.cancelsTouchesInView = false // Теперь и тап сработает, и touchesBegan не обделят
view.addGestureRecognizer(tapRecognizer)
Вот и вся ебёная механика. Либо жест жрёт всё, либо делится, если его правильно попросить.