В UIKit, когда UIView не может обработать касание (touch event)?

«В UIKit, когда UIView не может обработать касание (touch event)?» — вопрос из категории UIKit, который задают на 10% собеседований IOS Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

UIView пропускает или не получает события касания при следующих условиях:

  • Свойства видимости и взаимодействия:
    • isUserInteractionEnabled = false
    • isHidden = true
    • alpha <= 0.01
  • Геометрия:
    • Касание произошло за пределами границ вью (bounds).
    • Если clipsToBounds = true, части вью за своими границами не получают события.
  • Перехват события другой вью: Вью с более высоким порядком в иерархии (расположенная поверх) может перехватить событие.
  • Кастомная логика hit-testing: Неправильная реализация методов hitTest(_:with:) или point(inside:with:) может привести к потере события.
    // Пример: вью игнорирует все касания
    override func point(inside point: CGPoint, with event: UIEvent?) -> Bool {
        return false
    }

Для отладки используйте:

  1. Debug View Hierarchy в Xcode для визуализации слоёв.
  2. Проверку флагов isUserInteractionEnabled, alpha, isHidden.
  3. Пошаговый анализ цепочки ответа (hit-test chain).