Ответ
Положение и размер 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 останется прежним.