Что хранит свойство frame у UIView?

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

Ответ

Свойство frame (CGRect) описывает положение и размер UIView в системе координат её родительской вью (superview).

Что хранится в frame:

  • origin.x и origin.y: Координаты левого верхнего угла вью относительно левого верхнего угла её superview.
  • size.width и size.height: Ширина и высота вью.

Критически важные нюансы:

  1. Зависимость от bounds и center: Значение frame является вычисляемым и зависит от bounds.size и center. Прямое изменение frame может неявно изменить center.
  2. Игнорирование трансформаций: frame становится неопределённым (CGRect.null), если к вью применён ненулевой transform (например, поворот). Для позиционирования трансформированной вью используйте center.
  3. Конфликт с Auto Layout: Прямая установка frame для вью, управляемой Auto Layout (имеющей constraints), приводит к конфликту. Система может перезаписать ваш frame на следующем цикле обновления лэйаута.

Пример:

// Создаём вью, позиционируя её в точке (20, 30) родительской вью
let view = UIView(frame: CGRect(x: 20, y: 30, width: 100, height: 50))
print(view.frame) // (x: 20.0, y: 30.0, width: 100.0, height: 50.0)