Для чего переопределяют методы hitTest(_:with:) и point(inside:with:) в UIKit?

«Для чего переопределяют методы hitTest(_:with:) и point(inside:with:) в UIKit?» — вопрос из категории UIKit, который задают на 10% собеседований IOS Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Эти методы отвечают за hit-testing — процесс определения, какое UIView должно получить касание. Их переопределение позволяет кастомизировать логику отклика на касания.

point(inside:with:)

  • Задача: Определяет, лежит ли точка касания в пределах bounds вью.
  • Переопределяют для: Расширения или сужения области отклика.

hitTest(_:with:)

  • Задача: Возвращает самое глубокое (frontmost) вью, которое должно получить событие.
  • Переопределяют для: Перенаправления событий или изменения иерархии hit-testing.

Практический пример — увеличение тап-области маленькой кнопки:

class ExpandedTapButton: UIButton {
    private let tapAreaPadding: CGFloat = 20

    override func point(inside point: CGPoint, with event: UIEvent?) -> Bool {
        // Расширяем область отклика на 20 пунктов со всех сторон
        let expandedBounds = bounds.insetBy(dx: -tapAreaPadding, dy: -tapAreaPadding)
        return expandedBounds.contains(point)
    }

    // hitTest обычно не трогаем, если не нужно менять целевое view
}

Другие сценарии использования:

  • Игнорирование прозрачных областей: Проверять альфа-канал пикселя в точке касания.
  • Перенаправление событий: Например, чтобы родительское view обрабатывало тапы поверх дочерних, которые их игнорируют.
  • Создание нестандартной формы отклика (не прямоугольной).

⚠️ Важно: Переопределять эти методы следует аккуратно, чтобы не сломать стандартное поведение responder chain.