Чем отличаются frame и bounds?ios-74

frame и bounds — это два свойства UIView, которые часто вызывают путаницу у начинающих разработчиков. Оба они относятся к геометрии view, но имеют принципиальные различия.

1. frame

  • Определение: frame описывает положение и размер view в системе координат родительской view.
  • Тип: CGRect (origin + size).
  • Особенности:
    • Положение (origin) — это точка относительно родительской view.
    • Изменение frame влияет на отображение view (например, перемещение или масштабирование).
    • При вращении view (transform) frame может измениться неинтуитивно, так как он описывает ограничивающий прямоугольник.
let view = UIView(frame: CGRect(x: 20, y: 20, width: 100, height: 100))
// Положение (20, 20) относительно superview

2. bounds

  • Определение: bounds описывает положение и размер view в её собственной системе координат.
  • Тип: CGRect (origin + size).
  • Особенности:
    • По умолчанию origin равен (0, 0), так как это внутренние координаты.
    • Изменение bounds.origin "прокручивает" содержимое view (например, в UIScrollView).
    • bounds.size определяет внутреннюю область для отрисовки.
    • Не зависит от transform.
view.bounds = CGRect(x: 10, y: 10, width: 100, height: 100)
// "Сдвигает" внутреннее содержимое view

Ключевые отличия

Характеристикаframebounds
Система координат Родительская view Собственная view
origin Положение относительно родителя Обычно (0, 0)
Зависимость от transform Да (может измениться) Нет
Использование Для расположения view в иерархии Для внутренней геометрии

Пример с вращением

view.transform = CGAffineTransform(rotationAngle: .pi / 4)
// frame изменится (будет описывать ограничивающий прямоугольник),
// bounds останется прежним

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

  • frame: Когда нужно изменить положение или размер view в родительской системе координат.
  • bounds: Когда работаете с внутренним содержимым (например, рисование в drawRect), или настраиваете UIScrollView.

Резюмируем:

frame — это "внешняя" геометрия view, а bounds — "внутренняя". Понимание этой разницы критично для корректной работы с анимациями, трансформациями и кастомной отрисовкой.