Ответ
Нет, напрямую — нельзя. Когда isUserInteractionEnabled = false, система UIKit полностью игнорирует все жесты и касания на этом представлении. Однако существуют обходные пути для перехвата событий:
1. Прозрачное наложение (Overlay View)
Добавьте поверх целевой вью прозрачное представление с включенным взаимодействием.
let overlay = UIView(frame: targetView.bounds)
overlay.isUserInteractionEnabled = true
targetView.addSubview(overlay)
let tapRecognizer = UITapGestureRecognizer(target: self, action: #selector(handleTap))
overlay.addGestureRecognizer(tapRecognizer)
2. Переопределение hitTest(_:with:)
Можно перехватить и перенаправить события, переопределив метод hitTest в кастомной вью.
override func hitTest(_ point: CGPoint, with event: UIEvent?) -> UIView? {
let hitView = super.hitTest(point, with: event)
// Возвращаем nil для себя, чтобы события прошли "сквозь" эту вью
return hitView == self ? nil : hitView
}
3. Программный вызов действий (для UIControl)
Для элементов UIControl (кнопки, слайдеры) можно использовать метод sendActions(for:) для программной отправки событий.
button.sendActions(for: .touchUpInside)
Важно: Эти методы являются обходными и могут усложнить архитектуру. Основное правило — если вью должна реагировать на касания, isUserInteractionEnabled должно быть true.