В UIKit, относительно какой системы координат позиционируется subview внутри superview?

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

Ответ

Положение и размер subview определяются относительно системы координат bounds его superview.

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

  • frame — описывает положение view в системе координат его родительского view.
  • bounds — описывает внутреннюю систему координат view (её «холст»). bounds.origin может быть отличным от (0, 0), например, при скролле UIScrollView.

Пример:

let parentView = UIView(frame: CGRect(x: 50, y: 50, width: 200, height: 200))
// Система координат parentView.bounds начинается с (0, 0)

let childView = UIView(frame: CGRect(x: 20, y: 20, width: 50, height: 50))
// Положение (20, 20) отсчитывается от parentView.bounds.origin
parentView.addSubview(childView)

Если изменить parentView.bounds.origin (например, parentView.bounds.origin.y = -50), все subviews визуально сместятся, хотя их frame останется прежним.