Ответ
Эти методы отвечают за 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.