Проверяйте доступность view и попадание в bounds, затем обходите subviews в обратном порядке, переводя точку в координаты каждого ребёнка.
Создать собственный метод hitTest без использования событий
Проверяйте доступность view и попадание в bounds, затем обходите subviews в обратном порядке, переводя точку в координаты каждого ребёнка.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Условие
Разработать простой механизм hitTest, обходясь без системных событий, который позволяет определить, в какой дочерний UIView попал переданный CGPoint.
Ответ
Проверяйте доступность view и попадание в bounds, затем обходите subviews в обратном порядке, переводя точку в координаты каждого ребёнка.
Упрощённый геометрический hit-test без UIEvent:
func hitTest(_ point: CGPoint, in view: UIView) -> UIView? {
guard !view.isHidden, view.alpha > 0.01,
view.isUserInteractionEnabled,
view.bounds.contains(point) else { return nil }
for child in view.subviews.reversed() {
let local = child.convert(point, from: view)
if let hit = hitTest(local, in: child) { return hit }
}
return view
}
Начальная точка задаётся в координатах root-view. Обратный обход даёт приоритет верхним subviews. Это базовая модель: она не учитывает пользовательские переопределения point(inside:with:), нестандартные области нажатия и presentation-геометрию во время анимации. Если нужны только дочерние элементы, исключите root из результата.