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

Когда лучше использовать Bounds?

2.0 Middle🔥 241 комментариев
#UIKit и верстка

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

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

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

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

bounds — это одно из ключевых геометрических свойств любого UIView (или CALayer), определяющее его внутреннюю систему координат. В отличие от frame, которое описывает положение и размер представления в системе координат его супервью (родительского view), bounds описывает положение и размер относительно собственной внутренней системы координат. Его прямоугольник почти всегда начинается с точки (0, 0) (origin), а размер (size) равен внутреннему содержимому представления.

Основные случаи использования bounds

Использование bounds становится необходимым или предпочтительным в следующих ситуациях:

1. Работа с внутренним содержимым и субвью (subviews)

Когда вы добавляете, располагаете или трансформируете субвью внутри родительского представления, вы должны использовать его bounds. Координаты субвью задаются относительно внутреннего пространства родителя.

let childView = UIView()
parentView.addSubview(childView)
// Положение childView задается относительно origin (0,0) родителя
childView.frame = CGRect(x: 20, y: 20, width: Pm100, height: 100)
// Здесь используются координаты из parentView.bounds

2. Обработка касаний (touch handling) и система координат событий

В методах обработки событий, таких как touchesBegan(_:with:), координаты касаний предоставляются относительно bounds того представления, в котором произошло событие. Для корректной интерпретации позиции касания внутри view необходимо сравнивать ее с bounds.

override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
    if let touch = touches.first {
        let locationInView = touch.location(in: self)
        // locationInView находится в системе координат self.bounds
        if self.bounds.contains(locationInView) {
            // Обрабатываем касание внутри view
        }
    }
}

3. Вычисление и задание центра представления (center)

Свойство center задается относительно bounds супервью, но логически связано с собственным bounds. Например, чтобы установить view точно в центр своего супервью, вы часто используете половину размеров bounds супервью.

subview.center = CGPoint(
    x: superview.bounds.midX,
    y: superview.bounds.midY
)

4. Когда view подвергается трансформациям (transform)

Если к представлению применена аффинная трансформация (например, rotation, scale), его frame становится неопределенным или вычисляется автоматически системой и может давать неожиданные значения. В таком случае bounds остается надежным источником информации о внутренних размерах view до трансформации.

let view = UIView(frame: CGRect(x: 0, y: 0, width: 100, height: 100))
view.transform = CGAffineTransform(rotationAngle: .pi / 4)
// view.frame теперь может быть другим (больше из-за вращения)
// Но view.bounds остается CGRect(0, 0, 100, 100)
print(view.bounds) // (0.0, 0.0, 100.0, 100.0)

5. Отрисовка контента в drawRect или работа с Core Graphics

При перерисовке контента внутри метода draw(_:) (или в контексте Core Graphics) вы работаете в системе координат, определенной bounds. Графические операции выполняются относительно его origin и размеров.

override func draw(_ rect: CGRect) {
    let context = UIGraphicsGetCurrentContext()
    // rect обычно является частью self.bounds
    let path = UIBezierPath(ovalIn: self.bounds)
    context?.addPath(path.cgPath)
}

Ключевые различия frame и bounds

  • frame: Используется для задания положения view относительно его родителя (супервью). Изменение frame влияет на center и bounds.size.
  • bounds: Используется для всего, что происходит внутри view: расположение субвью, обработка событий, отрисовка. Изменение bounds.size влияет на frame.size, изменение bounds.origin сдвигает внутреннюю систему координат, что приводит к визуальному перемещению всего содержимого (субвью, рисунков) внутри view.

Практическое правило

  • Если вы работаете с внешним расположением view (где оно находится на экране относительно других view) — используйте frame (или часто лучше center и bounds.size для изменения размера).
  • Если вы работаете с внутренним содержимым view (добавление субвью, рисование, обработка касаний) — всегда используйте bounds.

Таким образом, bounds — это фундаментальное свойство для понимания системы координат внутри UIView, и его правильное использование обеспечивает корректное расположение контента и обработку взаимодействий.