При поиске решения, позволяющего скрыть пользовательское представление ввода, когда пользователь нажимает за его пределами, я нахожу этот код :
extension UIViewController {
func hideKeyboardWhenTappedAround() {
let tap: UITapGestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(UIViewController.dismissKeyboard))
tap.cancelsTouchesInView = false
view.addGestureRecognizer(tap)
}
@objc func dismissKeyboard() {
view.endEditing(true)
}
}
Код отлично работает для меня, но я не Я не совсем понимаю, почему важно установить cancelsTouchesInView
на false
.
Я прочитал официальное заявление Apple c по этому свойству и объяснение по SO. Я думаю, что я их хорошо понимаю. Что я не понимаю, так это то, что в приведенном выше примере представление является представлением root, как его cancelsTouchesInView
может повлиять на событие касания, получающего подпредставление? Насколько я понимаю, когда viewcontroller получает событие касания пользователя из системной очереди, он сначала выполняет проверку попадания, чтобы определить самое внутреннее подпредставление, которого касается пользователь, затем событие обрабатывается и распространяется снизу вверх по цепочке респондента. Таким образом, событие должно быть обработано сначала подпредставлением, а затем просмотром root. Если так, то почему его свойство cancelsTouchesInView
равное true
(значение по умолчанию) может помешать его подпредставлению получать сенсорные события?