Как изменение свойства origin у Bounds влияет на UIView?

Ответ

Изменение bounds.origin смещает систему координат внутри вью относительно её собственного пространства, не изменяя положение вью (frame) в родительском контейнере. Это влияет на отрисовку внутреннего контента и расположение сабвью.

Пример:

// Сдвигаем начало координат вью на (20, 20)
view.bounds.origin = CGPoint(x: 20, y: 20)

Что происходит:

  1. Контент вью (например, изображение в UIImageView) визуально сдвинется на 20 точек влево и вверх.
  2. Сабвью остаются на тех же позициях относительно новой системы координат bounds.
  3. Положение вью (frame.origin) в родительской вью не изменится.

Важно: В отличие от изменения bounds.size, изменение bounds.origin не вызывает автоматический вызов layoutSubviews().

Ответ 18+ 🔞

А, слушай, вот эта штука с bounds.origin — это вообще пиздец какой-то магический трюк, который мозг выносит напрочь. Представь себе картину, блядь.

Вот есть у тебя вьюха. Она как бы стоит на своём месте в родителе, её frame — это её габариты и позиция в мире. Всё чётко. А внутри неё есть своя собственная вселенная, своя система координат. И начало этой вселенной — это как раз bounds.origin. По умолчанию оно в точке (0, 0), то есть в левом верхнем углу самой вьюхи.

И вот ты такой берёшь и делаешь:

view.bounds.origin = CGPoint(x: 20, y: 20)

И тут начинается ёперный театр, блядь. Ты не двигаешь саму вьюху! Она как стояла на своём месте у родителя, так и стоит, её frame.origin не меняется ни на йоту. Ты двигаешь её внутреннюю систему координат. Ты берёшь и говоришь: «Знаешь что? Отныне точка (0,0) в твоём внутреннем мире находится не в твоём левом верхнем углу, а на 20 точек правее и ниже!».

И что получается? Вся внутренняя хуйня — картинка в UIImageView, твои сабвьюхи — они-то привязаны к этой внутренней системе координат! И раз ты начало координат сдвинул, то им всем кажется, что их визуально потянуло в противоположную сторону. Картинка уедет на 20 точек влево и вверх, как будто её подрезали. Сабвью формально останутся на тех же frame.origin относительно родителя (этой вьюхи), но поскольку система отсчёта съехала, они тоже визуально сместятся. Это как если бы ты лист бумаги с рисунком держал на месте, а под ним линейку с делениями сдвинул — рисунок-то на месте, но его координаты изменились, ёпта!

И самый подлый прикол, на котором все обжигаются: когда ты меняешь bounds.size, система аж вздрагивает и зовёт layoutSubviews(), чтобы всё пересчитать. А тут — тишина, блядь. Сдвинул origin — и нихуя. Автоматического вызова layoutSubviews() не происходит. Типа, «сам разбирайся, что у тебя там поехало, я только систему координат перенёс».

Вот такая, блядь, хитрая жопа. Не положение вьюхи меняешь, а её внутреннюю реальность под себя гнёшь. Чистая магия, в рот меня чих-пых.