High performance AutoLayout.key.zip

High Performance Auto Layout - WWDC18 - Videos - Apple Developer

[WWDC] High Performance Auto Layout

Internals And Intuition

The Render Loop

TL;DR

초당 120번 실행됨. Update Constraints, Layout, Display 3가지의 단계로 구성되어 있음. 불필요한 작업을 피할 때 매우 유용함

  1. 모든 View들이 Leap에서부터 Window까지 View Hierachy를 따라 올라가며 updateConstraints를 수신 함
  2. 모든 View들이 Window부터 Leaf까지 내려가며 layoutSubviews()를 수신함
  3. 마지막으로, 필요한 경우 모든 View가 그려짐

Untitled

Untitled

Example

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()
}
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()
}

Activating a Constraint