Ответ
Свойство bounds (CGRect) определяет внутреннюю систему координат UIView относительно её собственных границ.
Что хранится в bounds:
origin(обычно(0, 0)): Начало системы координат для всего внутреннего содержимого (subviews, drawing).size: Внутренняя ширина и высота вью. Обычно совпадает сframe.size, если не применены трансформации (transform).
Отличие от frame: frame описывает положение и размер вью в системе координат её родителя (superview), а bounds — в её собственной системе координат.
Пример и важный нюанс:
let view = UIView(frame: CGRect(x: 20, y: 20, width: 100, height: 100))
print(view.bounds) // (x: 0.0, y: 0.0, width: 100.0, height: 100.0)
// Сдвиг bounds.origin НЕ меняет положение вью на экране,
// но сдвигает её внутреннее содержимое (например, subviews).
view.bounds.origin = CGPoint(x: 10, y: 10)
// Теперь система координат для subviews начинается с точки (10,10) внутри view.
Основное применение: Изменение bounds.origin — это основа реализации скроллинга (как в UIScrollView).
Ответ 18+ 🔞
Ага, слушай, вот есть у тебя эта UIView, да? Ну, вьюха, прямоугольник. Так вот, у неё есть такое свойство bounds — это, блядь, как её внутренний паспорт, её личная система координат, в которой она сама у себя живёт.
Что там внутри этого bounds сидит:
origin(обычно(0, 0)): Это, сука, точка отсчёта для всего, что внутри неё творится — для сабвьюшек, для рисования линий, для всего. Как ноль на её личной линейке.size: Ну, это её внутренние габариты, ширина-высота. Чаще всего они совпадают с размерами изframe, если ты её, конечно, не скрутил как уж на сковородке черезtransform.
А в чём, собственно, разница с frame? Да всё просто, как три копейки! frame — это где она торчит относительно своего родителя, в координатах супервью. А bounds — это её собственные, внутренние владения, её личное пространство.
Смотри пример, тут прикол:
let view = UIView(frame: CGRect(x: 20, y: 20, width: 100, height: 100))
print(view.bounds) // (x: 0.0, y: 0.0, width: 100.0, height: 100.0)
// А вот сейчас магия, ёпта! Сдвигаем bounds.origin.
// ВНИМАНИЕ: вьюха на экране НИ ХУЯ не сдвинется!
// Зато у неё внутри ВСЁ содержимое (те же сабвьюхи) поползёт в обратную сторону.
view.bounds.origin = CGPoint(x: 10, y: 10)
// Теперь точка (0,0) для её детей — это уже (10,10) внутри неё самой. Представь, будто ты внутри комнаты сдвинул всю мебель, а сама комната на плане этажа осталась на месте. Вот это пиздец!
И главный козырь, зачем это всё: Изменение bounds.origin — это, блядь, священный грааль, основа основ скроллинга! Именно так UIScrollView и работает: он не бегает сам по экрану, он просто внутри себя двигает эту самую точку отсчёта, и всё его содержимое едет, как на конвейере. Гениально и просто, в рот меня чих-пых!