Ответ
При применении аффинного преобразования (например, поворота) к 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 в этой игре — зритель, и то на галёрке.