Как изменятся bounds UIView при повороте родительского view на 45 градусов?

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

Ответ

bounds останутся неизменными, так как они определяют внутреннюю систему координат view и не зависят от внешних трансформаций.

Ключевые отличия:

Свойство Определение Зависит от transform Изменяется при повороте родителя
bounds Прямоугольник в собственной системе координат view (origin, size) ❌ Нет ❌ Нет
frame Прямоугольник в системе координат родительского view ✅ Да ✅ Да

Пример:

let parentView = UIView(frame: CGRect(x: 0, y: 0, width: 100, height: 100))
let childView = UIView(frame: CGRect(x: 20, y: 20, width: 60, height: 60))
parentView.addSubview(childView)

// Поворачиваем родителя на 45°
parentView.transform = CGAffineTransform(rotationAngle: .pi / 4)

print("Parent bounds:", parentView.bounds) // (0.0, 0.0, 100.0, 100.0) - не изменились
print("Parent frame:", parentView.frame)   // Изменится (может стать отрицательным)
print("Child bounds:", childView.bounds)   // (0.0, 0.0, 60.0, 60.0) - не изменились
print("Child frame:", childView.frame)     // Изменится относительно родителя

Практическое значение:

  • bounds используют для внутреннего layout (например, в drawRect:)
  • frame используют для позиционирования относительно родителя
  • При анимациях с transform работают с frame, а bounds остаются стабильными