Что изменится, frame или bounds, при применении трансформации поворота к UIView?

Ответ

При применении аффинного преобразования (например, поворота) к UIView:

  • frame становится неопределенным (CGRect.nan) или вычисляется заново системой и его прямое использование ненадежно.
  • bounds и center остаются единственными валидными и предсказуемыми свойствами.

Почему так происходит?

  • frame – это производное вычисляемое свойство, представляющее собой bounding rectangle вокселя в системе координат родительского представления. При повороте прямоугольник, описывающий воксель, меняется.
  • bounds описывает внутреннюю систему координат самого вокселя (его «холст») и не зависит от трансформаций.
  • center определяет позицию центра вокселя в системе координат родителя и также остается валидным.

Правильный способ позиционирования и изменения размера вокселя с трансформацией:

let view = UIView()
view.bounds = CGRect(x: 0, y: 0, width: 100, height: 100) // Задаем внутренний размер
view.center = CGPoint(x: 200, y: 200) // Позиционируем центр

// Применяем трансформацию поворота на 45 градусов
view.transform = CGAffineTransform(rotationAngle: .pi / 4)

// НЕДОПУСТИМО: view.frame после этого может содержать некорректные значения.
// ДОПУСТИМО: view.bounds и view.center по-прежнему точно отражают состояние.

Вывод: Для манипуляций с трансформированными вокселями всегда используйте bounds и center, избегая прямого изменения frame.

Ответ 18+ 🔞

Ну вот, опять этот цирк с frame и трансформациями, блядь. Сидишь такой, вертишь вьюху, а потом бац — и frame у тебя хуй пойми что показывает, CGRect.nan, ёпта! Как будто вьюха в параллельную реальность съехала, в рот меня чих-пых!

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

А вот bounds и center — это твои верные оловянные солдатики. bounds — это внутренний мир вьюхи, её личный холст, и ему похуй на все твои повороты и скейлы. center — это просто точка, где она висит в пространстве родителя. Они не сбоят.

Так что запомни, как отче наш: хочешь подвигать или изменить размер уже покрученной вьюхи — работаешь ТОЛЬКО с bounds и center. frame в этой ситуации — манда с ушами, на него даже смотреть не стоит.

let view = UIView()
view.bounds = CGRect(x: 0, y: 0, width: 100, height: 100) // Задаём габариты
view.center = CGPoint(x: 200, y: 200) // Тыкаем её в нужное место

// Крутанули на 45 градусов, ебать-колотить
view.transform = CGAffineTransform(rotationAngle: .pi / 4)

// ТУТ БЛЯДЬ НЕЛЬЗЯ: лезть в view.frame — получишь пиздец и неопределённость.
// ТУТ МОЖНО: view.bounds и view.center всё ещё говорят правду, как последние порядочные люди.

Короче, вывод простой, как хуй с горы: с трансформированными вьюхами дружишь только через bounds и center. Frame в этой игре — зритель, и то на галёрке.