Ответ
Responder Chain — это цепочка объектов (UIResponder), по которой распространяются события (касания, встряхивания, команды меню и т.д.). Чтобы исключить участника:
1. Переопределение свойства next
Можно «пропустить» себя, вернув следующего ответчика дальше по цепочке.
class CustomView: UIView {
override var next: UIResponder? {
// Пропускаем родительский UIView и передаём событие дальше
return super.next?.next
}
}
2. Запрет стать First Responder Объект, который не может стать first responder, не будет получать события, предназначенные для него (например, ввод текста).
override var canBecomeFirstResponder: Bool {
return false
}
3. Принудительный отказ от статуса First Responder Если объект в данный момент является first responder, можно заставить его уступить этот статус.
myTextField.resignFirstResponder()
// Или для любого UIResponder:
_ = myCustomView.resignFirstResponder()
4. Игнорирование конкретных событий Более точечный подход — переопределить методы обработки событий, чтобы они не передавались дальше.
override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
// Не вызываем super — событие не пойдёт дальше по Responder Chain.
// Выполняем только своё действие.
handleTouchInternally()
}
Практический пример: Допустим, у вас есть контейнерная вью (ContainerView), которая должна игнорировать все касания, передавая их сразу дочерним элементам.
class PassthroughView: UIView {
override func hitTest(_ point: CGPoint, with event: UIEvent?) -> UIView? {
let hitView = super.hitTest(point, with: event)
// Если касание пришлось на саму PassthroughView, игнорируем её.
return hitView == self ? nil : hitView
}
}
Важно: Изменение стандартного поведения Responder Chain может нарушить ожидаемую логику работы контролов (кнопок, текстовых полей) и доступность. Действуйте осознанно.