TL;DR
- 초당 120번 실행된다.
- Update Cosntraints, Layout, Display 3가지의 단계로 구성되어 있다.
- 불필요한 작업을 피할 때 매우 유용하다.
Render Loop는 잠재적으로 초당 120번 실행되는 프로세스이다.
Render Loop는 모든 콘텐츠가 각 프레임 에 대해 준비되었는지 확인한다.
이는 Update Constraints, Layout, Display 3가지의 단계로 구성되어져 있다.
모든 view들이 Leaf 에서 부터 window까지 View Hierarchy를 따라 올라가며 updateConstraints
를 수신한다.
모든 view들이 Window 부터 Leaf까지 내려가며 layoutSubviews()
를 수신한다.
마지막으로, 필요한 경우 모든 view가 그려진다.
setNeedsUpdateConstraints()
를 호출하면 프레임이 화면으로 이동하기 직전에 updateConstraints()
를 호출하게 할 수 있다.var myConstraints: [NSLayoutConstraints] = []
override func updateConstraints() {
// 1. 모든 constraints에 대하여 비활성화한다.
NSLayoutConstraint.deactivate(myConstraints)
myConstraints.removeAll()
// 2. Layout을 구현하는 constraints를 생성한다.
let views = ["text1":text1, "text2":text2]
myConstraints += NSLayoutConstraint.constraints(withVisualFormat: "H:|-[text1]-[text2]",
options: [.alignAllFirstBaseline],
metrics: nil, views: views)
myConstraints += NSLayoutConstraint.constraints(withVisualFormat: "V:|-[text1]-|",
options: [],
metrics: nil, views: views)
// 3. 모든 constraints를 활성화한다.
NSLayoutConstraint.activate(myConstraints)
super.updateConstraints()
}
updateConstraints()
에서 모든 constaints를 deactivate / activate 하는 것은layoutSubviews()
에서 모든 subviews를 remove / add 하는 것과 동일하다.var myConstraints: [NSLayoutConstraints] = []
override func updateConstraints() {
// 불필요하게 모든 constraints를 deactivate/activate 하지않도록 한 번 이상은 작업을 수행하지 않도록한다.
if myConstraints.isEmpty {
NSLayoutConstraint.deactivate(myConstraints)
myConstraints.removeAll()
let views = ["text1":text1, "text2":text2]
myConstraints += NSLayoutConstraint.constraints(withVisualFormat: "H:|-[text1]-[text2]",
options: [.alignAllFirstBaseline],
metrics: nil, views: views)
myConstraints += NSLayoutConstraint.constraints(withVisualFormat: "V:|-[text1]-|",
options: [],
metrics: nil, views: views)
NSLayoutConstraint.activate(myConstraints)
}
super.updateConstraints()
}
setNeedsLayout()
를 받았기 때문에, 어떠한 지점에서 Layout 단계로 이동한다.layoutSubViews()
를 받게 된다.setCenter
, setBounds
를 호출한다.Engine은 Layout Cache이고 Dependency Tracker이다.
- 어떤 constraints가 어떤 View에 영향을 미치는지 이해하고, 변경하면 필요한 것만 업데이트한다.
intrinsicContentSize
가 필요하지는 않다.UIImageView
, UILabel
) 의 경우, 내용의 크기(e.g. image size, text size)를 반환한다.UIView
는 intrinsicContentSize
를 이용하여 constraints를 만든다.intrinsicContentSize
는 engine에 넣을 크기 정보를 전달하는 방법이다.systemLayoutSizeFitting(_:)
는 engine에서 크기 정보를 다시 가져 오는 방법이다.systemLayoutSistemFitting(_:)
가 호출되면, Engine이 생성된다.