frame
и bounds
— это два свойства UIView
, которые часто вызывают путаницу у начинающих разработчиков. Оба они относятся к геометрии view, но имеют принципиальные различия.
frame
описывает положение и размер view в системе координат родительской view.CGRect
(origin + size).origin
) — это точка относительно родительской view.frame
влияет на отображение view (например, перемещение или масштабирование).transform
) frame
может измениться неинтуитивно, так как он описывает ограничивающий прямоугольник.let view = UIView(frame: CGRect(x: 20, y: 20, width: 100, height: 100))
// Положение (20, 20) относительно superview
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
Характеристика | frame | bounds |
---|---|---|
Система координат | Родительская view | Собственная view |
origin | Положение относительно родителя | Обычно (0, 0) |
Зависимость от transform | Да (может измениться) | Нет |
Использование | Для расположения view в иерархии | Для внутренней геометрии |
view.transform = CGAffineTransform(rotationAngle: .pi / 4)
// frame изменится (будет описывать ограничивающий прямоугольник),
// bounds останется прежним
frame
: Когда нужно изменить положение или размер view в родительской системе координат.bounds
: Когда работаете с внутренним содержимым (например, рисование в drawRect
), или настраиваете UIScrollView
. frame
— это "внешняя" геометрия view, а bounds
— "внутренняя". Понимание этой разницы критично для корректной работы с анимациями, трансформациями и кастомной отрисовкой.