Вопрос проверяет глубокое понимание механизма hit-testing и умение кастомизировать обработку касаний.
point(inside:with:) отвечает только на вопрос, попадает ли точка внутрь view. hitTest(_:with:) определяет, какая именно view должна обработать событие. Первый метод — это фильтр, второй — механизм поиска. Их часто переопределяют вместе, но назначение у них принципиально разное.
Эти два метода тесно связаны, но выполняют разные роли в процессе hit-testing. Понимание их различий — ключ к корректной обработке сложных касаний.
point(inside:with:) — проверяет, находится ли точка внутри view
hitTest(_:with:) — возвращает view, которая должна обработать событие
Этот метод:
получает точку в координатах view
возвращает true или false
не выбирает обработчика
Используется как фильтр:
если false, view и её сабвью игнорируются
Типовой пример:
override func point(inside point: CGPoint, with event: UIEvent?) -> Bool {
return bounds.insetBy(dx: -20, dy: -20).contains(point)
}
Этот метод:
запускает поиск обработчика
вызывает point(inside:with:)
рекурсивно проверяет сабвью
возвращает конкретную UIView
Упрощённая логика:
Проверить, можно ли обрабатывать события
Проверить попадание точки
Проверить сабвью (сверху вниз)
Вернуть найденную view или себя
point(inside:) → можно ли вообще взаимодействовать
hitTest → кто именно будет взаимодействовать
увеличение зоны нажатия кнопки → point(inside:)
прокидывание касаний сквозь view → hitTest
сложные overlay-экраны → переопределение обоих методов
point(inside:) — логический фильтр, hitTest — механизм выбора обработчика. Путаница между ними приводит к трудноуловимым багам в обработке касаний.