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