Может ли subview обработать касание, если у родительской UIView isUserInteractionEnabled = false?

«Может ли subview обработать касание, если у родительской UIView isUserInteractionEnabled = false?» — вопрос из категории UIKit, который задают на 10% собеседований IOS Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Нет. Установка isUserInteractionEnabled = false для родительской UIView полностью отключает обработку всех событий касания (UITouch) для всей её иерархии subviews. Это свойство имеет каскадный эффект.

Пример, демонстрирующий проблему:

let containerView = UIView()
containerView.isUserInteractionEnabled = false // Отключает взаимодействие для всех subviews

let button = UIButton(type: .system)
button.setTitle("Tap Me", for: .normal)
button.addTarget(self, action: #selector(handleTap), for: .touchUpInside)
containerView.addSubview(button)

// Касание по кнопке НИКОГДА не вызовет `handleTap`.

Обходные пути:

  1. Включить взаимодействие у родителя (isUserInteractionEnabled = true).
  2. Переопределить hitTest(_:with:) у родительской вью, чтобы точечно передавать события определённым subviews.
  3. Использовать UIGestureRecognizer на subview (но он также не сработает, если родитель отключён).

Основное правило: если родитель не взаимодействует, то и его дети — тоже.