← Назад к вопросам

Что такое point(inside: )?

1.6 Junior🔥 132 комментариев
#UIKit и верстка

Комментарии (2)

🐱
deepseek-v3.2PrepBro AI5 апр. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Метод point(inside:with:) в UIView

Метод point(inside:with:) — это фундаментальный метод класса UIView, который определяет, попадает ли заданная точка в границы представления (view) с учётом его иерархии и возможных преобразований системы координат.

Назначение и принцип работы

Основная задача метода — ответить на вопрос: находится ли точка внутри bounds (границ) данного view? Он вызывается системой UIKit в процессе hit-testing (определения попадания) для определения, какое представление должно получить касание или другое событие.

func point(inside point: CGPoint, with event: UIEvent?) -> Bool
  • point — координата в системе координат принимающего view (то есть относительно его собственной системы координат).
  • event — объект события, который вызвал hit-testing (может быть nil).
  • Возвращаемое значениеtrue, если точка находится внутри bounds view, false в противном случае.

Как работает hit-testing в iOS

  1. Когда происходит касание, система начинает с окна (UIWindow) и вызывает hitTest(_:with:).
  2. hitTest(_:with:) сначала проверяет, находится ли точка внутри bounds view с помощью point(inside:with:).
  3. Если false — возвращается nil (касание мимо view).
  4. Если true — метод рекурсивно вызывает hitTest(_:with:) для каждого subview, начиная с самого верхнего (последнего добавленного).
  5. View с наибольшей глубиной (самый верхний), который вернёт не-nil значение, становится hit-test view.

Базовая реализация по умолчанию

Стандартная реализация просто проверяет, находится ли точка внутри прямоугольника bounds:

override func point(inside point: CGPoint, with event: UIEvent?) -> Bool {
    return bounds.contains(point)
}

Практические примеры переопределения

Разработчики часто переопределяют этот метод для:

1. Увеличения области отклика (hit area)

class ExpandableButton: UIButton {
    private let hitAreaInsets = UIEdgeInsets(top: -10, left: -10, bottom: -10, right: -10)
    
    override func point(inside point: CGPoint, with event: UIEvent?) -> Bool {
        let expandedBounds = bounds.inset(by: hitAreaInsets)
        return expandedBounds.contains(point)
    }
}

2. Игнорирования касаний в определённых областях

class CustomView: UIView {
    private let deadZoneRect = CGRect(x: intruscode0, y: intruscode0, width: 50, height: 50)
    
    override func point(inside point: CGPoint, with event: UIEvent?) -> Bool {
        // Точка должна быть внутри bounds, но НЕ внутри deadZone
        return bounds.contains(point) && !deadZoneRect.contains(point)
    }
}

3. Нестандартных форм представлений

class CircularView: UIView {
    override func point(inside point: CGPoint, with event: UIEvent?) -> Bool {
        let center = CGPoint(x: bounds.width/2, y: bounds.height/2)
        let radius = min(bounds.width, bounds.height) / 2
        let distance = hypot(point.x - center.x, point.y - center.y)
        return distance <= radius
    }
}

Важные особенности

  • Система координат: точка передаётся в системе координат текущего view, а не супервью или окна.
  • Игнорирование скрытых view: если isHidden = true, alpha ≤ 0.01 или isUserInteractionEnabled = false, view пропускается в hit-testing.
  • Производительность: hit-testing выполняется часто, поэтому переопределение не должно быть вычислительно сложным.
  • Каскадный эффект: если view возвращает false, все его subview также игнорируются для этого касания.

Связь с другими методами

  • hitTest(_:with:) — использует point(inside:with:) как первый шаг проверки.
  • convert(_:to:) / convert(_:from:) — для преобразования координат между разными системами координат view перед вызовом point(inside:with:).

Когда использовать

Переопределяйте point(inside:with:), когда вам нужно:

  • Изменить логическую форму отклика view
  • Создать невидимые области взаимодействия
  • Оптимизировать hit-testing для сложных view-иерархий
  • Реализовать кастомные контролы со специальным поведением при касании

Этот метод — ключевой элемент системы обработки событий iOS, позволяющий тонко контролировать, как и какие view реагируют на пользовательские взаимодействия.