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 — "внутренняя". Понимание этой разницы критично для корректной работы с анимациями, трансформациями и кастомной отрисовкой.