← Назад к вопросам

Что изменится при повороте экрана на 45 градусов, Frame или Bounds?

1.7 Middle🔥 151 комментариев
#UIKit и верстка

Комментарии (1)

🐱
deepseek-v3.2PrepBro AI5 апр. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Влияние поворота экрана на 45 градусов на Frame и Bounds UIView

При повороте экрана на 45 градусов (или любой другой угол, не являющийся стандартным поворотом на 90, 180 или 270 градусов, поддерживаемым системой), поведение frame и bounds зависит от того, как реализовано такое преобразование. В стандартных условиях iOS автоматические повороты экрана ограничены четырьмя основными ориентациями (portrait, landscape left, landscape right, portrait upside down), и система автоматически корректирует frame и bounds для всех UIView. Однако поворот на 45 градусов не является стандартной операцией и обычно требует ручной реализации через трансформации.

Ключевые изменения

  • frame: Это прямоугольник, описывающий положение и размер view в координатах системы координат супервиза (superview). При повороте на 45 градусов через transform (например, CGAffineTransform(rotationAngle: CGFloat.pi / 4)), frame становится недействительным для описания фактической визуальной области view. Система рассчитывает frame как минимальный прямоугольник, который может охватить трансформированную view, но его значения могут стать неинтуитивными (например, размеры могут увеличиться, чтобы вместить повернутую геометрию).
let view = UIView(frame: CGRect(x: 100, y:100, width: 100, height: 100))
view.transform = CGAffineTransform(rotationAngle: .pi / 4) // Поворот на 45°
print("Frame после поворота: \(view.frame)")
// Output может быть примерно: (x: 70.7, y: 70.7, width: 141.4, height: 141.4)
// Это охватывающий прямоугольник, не совпадающий с исходными 100x100.
  • bounds: Это прямоугольник, описывающий положение и размер view в собственных координатах view. Поворот на 45 градусов не изменяет bounds – они остаются такими же, как до трансформации (например, CGRect(origin: CGPoint.zero, size: CGSize(width: 100, height: 100))). bounds используются для внутреннего рисования и layout subviews.
print("Bounds после поворота: \(view.bounds)")
// Output: (x: 0, y: 0, width: 100, height: 100) – без изменений.

Практические следствия

  • Layout Subviews: Если view содержит subviews, их позиционирование относительно bounds не меняется при повороте. Однако если они также трансформируются, их frame может стать сложным для расчета.
  • Hit Testing: Система использует bounds вместе с transform для корректного определения касаний в повернутой области.
  • Авторесайзинг: При использовании автоматического поворота экрана (стандартные 90°), система обновляет frame всех view для нового ориентации, но bounds обычно остаются постоянными (если не меняется размер content). При повороте на 45 градусов, который не является системным, это не применяется.

Пример с вращением

Рассмотрим детальный пример:

// Создаем view
let parentView = UIView(frame: CGRect(x: 0, y: 0, width: 300, height: 300))
let childView = UIView(frame: CGRect(x: 50, y: 50, width: 100, height: 100))
childView.backgroundColor = .blue
parentView.addSubview(childView)

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

// Проверяем значения
print("Исходный frame childView: \(CGRect(x: 50, y: 50, width: 100, height: 100))")
print("Frame после transform: \(childView.frame)")
print("Bounds после transform: \(childView.bounds)")

// Frame изменится, bounds останутся (0,0,100,100)

Заключение

При повороте на 45 градусов:

  • frame изменяется, становясь охватывающим прямоугольником трансформированной view, что может привести к неожиданным значениям (увеличение ширины/высоты, смещение origin).
  • bounds остаются неизменными, так как они представляют внутреннюю геометрию view до трансформаций.

Это важно для понимания при работе с кастомными анимациями, интерактивными элементами или нестандартными UI, где точный контроль над координатами необходим. Для большинства стандартных задач iOS (адаптация к ориентациям экрана) используются стандартные механизмы поворота, которые автоматически управляют frame без изменения bounds.

Что изменится при повороте экрана на 45 градусов, Frame или Bounds? | PrepBro