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

«Что изменится, frame или bounds, при применении трансформации поворота к UIView?» — вопрос из категории UIKit, который задают на 10% собеседований IOS Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

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