Как система событий tap действительно работает в IOS?
Есть 3 способа (о которых я знаю) взаимодействовать с тапом в IOS:
- переопределить низкоуровневые методы UIResponder, такие как touchesBegin()
- используйте UITapGestureRecognizer(цель: действие:)
- если это тип UIControl, используйте addTarget(target:action:for:)
и пара логических значений для управления поведением
- UIResponder::canBecomeFirstResponder
- UIView:: isUserInteractionEnabled
У меня проблемы с тем, как я могу понять, как они работают вместе, поэтому я немного поэкспериментировал. Я создал простую цепочку респондента:
UIView (A) -> UIButton (B)
и я попытался перевернуть логические значения и добавить различные обработчики событий, вот мой вывод:
canBecomeFirstResponder ни на что не влияет, даже если я установил, что он возвращает false, событие перехватывается и распространяется по цепочке как обычно. Итак, мой первый вопрос: что именно контролирует canBecomeFirstResponder?
в соответствии с этим документом
Если для свойства isUserInteractionEnabled установлено значение false, события касания, нажатия, клавиатуры и фокуса, предназначенные для представления, игнорируются и удаляются из очереди событий.
Но в моем эксперименте isUserInteractionEnabled - это переключатель, чтобы отключить UIResponder на B(UIButton) и позволить следующему респонденту (A) перехватить событие. Таким образом, событие не "игнорируется", а распространяется вверх по цепочке.
- В этом документе также сказано, что
Реализация по умолчанию функции touchesBegin() направляет сообщение вверх по цепочке респондента.
В моем эксперименте функция touchesBegin() всегда вызывается перед распознавателем жестов (что имеет смысл, потому что касание не распознается, пока вы не поднимаете палец), но событие перехватывается только B, а не A.
Заранее спасибо!