Установка отменяет TouchInView при просмотре root - PullRequest
0 голосов
/ 29 апреля 2020

При поиске решения, позволяющего скрыть пользовательское представление ввода, когда пользователь нажимает за его пределами, я нахожу этот код :

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 (значение по умолчанию) может помешать его подпредставлению получать сенсорные события?

...