High performance AutoLayout.key.zip
High Performance Auto Layout - WWDC18 - Videos - Apple Developer
[WWDC] High Performance Auto Layout
TL;DR
초당 120번 실행됨.
Update Constraints
, Layout
, Display
3가지의 단계로 구성되어 있음.
불필요한 작업을 피할 때 매우 유용함
Render Loop
는 잠재적으로 초당 120번 실행되는 프로세스Render Loop
는 모든 콘텐츠가 각 프레임에 대해 준비되어있는지 확인함
View
들이 Leap
에서부터 Window
까지 View Hierachy
를 따라 올라가며 updateConstraints
를 수신 함View
들이 Window
부터 Leaf
까지 내려가며 layoutSubviews()
를 수신함View
가 그려짐property setter
를 호출할 것이고, 각각의 setter
에서 텍스트 사이즈를 다시 측정한다면 중간 것들이 모두 낭비될 것이기에 마지막에 측정되기만을 원할 것임.setNeedsUpdateConstraints()
를 호출하면 프레임이 화면으로 이동하기 직전에 updateConstraints()
를 호출하게 할 수 있다.var myConstraints: [NSLayoutConstraints] = []
override func updateConstraints() {
// 1. 모든 Constriants에 대하여 비활성화한다.
NSLayoutConstraint.deactivate(myConstraints)
myConstraints.removeAll()
// 2. Layout을 구현하는 constraints를 생성한다.
let views = ["text1" : text1, "text2" : text2]
myConstraints += NsLayoutConstraints.constraints(withVisualFormat: "H:|-[text1]-[text2]",
options: [.alignAllFirstBaseline],
metrics: nil, views: views)
myConstraints += NSLayoutConstraint.constraints(withVisualFormat: "V:|-[text1]-|",
options: [],
metrics: nil, views: views)
// 3. 모든 constraints를 활성화한다.
NSLayoutConstraints.activate(myConstraints)
super.updateConstraints()
}
updateConstaints()
에서 모든 Constraints를 deactivate / activate 하는 것
layoutSubviews
에서 모든 subviews를 remove / add 하는 것과 동일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()
}