Notice
Recent Posts
Recent Comments
Link
«   2024/10   »
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31
Archives
Today
Total
관리 메뉴

sanichdaniel의 iOS 개발 블로그

WWDC: The Layout Cycle 본문

카테고리 없음

WWDC: The Layout Cycle

sanich8355 2020. 12. 6. 16:07

The Layout Cycle

Layout은 Black Box일때가 많다.

뷰에 주어진 constraint으로부터 뷰에 프레임이 할당되기까지의 과정에 대해 알아보자

The Layout Cycle

1. Application Run Loop 이 돈다

2. Constraint가 변한다

Constraint 변하는 상황들에는 아래의 예시들이 있다.

1. activate or deactivate

2. setting constant or prioritiy

3. adding or removing views

 

Constraint change가 발생하면 Layout Engine은 layout을 다시 계산한다

뷰들은 자신의 superview가 layout을 다시 그려야한다고 마킹하다 (superview.setNeedsLayout()을 호출)
이 과정이 deferred layout pass를 스케줄한다.

3. deferred layout pass가 발생한다.

잘못 배치된 뷰들을 재배치해준다.

여기서 layout의 constraint를 업데이트하고 뷰 들의 프레임을 다시 계산한다.

deferred layout pass를 스케줄 하고 싶다면 setNeedsLayout이나  setNeedUpdateConstraints를 호출해주면 된다.

deferred layout pass는 2가지 단계를 거친다.

 

1. update pass

필요시, constraints를 업데이트한다

시스템은 뷰 계층을 돌며 뷰컨트롤러에 updateViewConstraints를 호출하고 뷰에 updateConstraints를 호출한다.

만약 constraints 업데이트가 느리거나, 뷰가 불필요하게 바뀌는 퍼포먼스 이슈 발생하여 constraints를 일괄적으로 업데이트 하고 싶을때는 이 함수들을 오버라이드 할 수 있다. 하지만 지금까지 작업하며 오버라이드 한적이 한번도 없었고 WWDC나 아래 스택오버플로우 답글에서도 그때그때 컨스트레인트를 업데이트하는것을 추천한다.

 

2. layout pass

필요시, 뷰의 프레임을 다시 재배치한다.

시스템은 뷰 계층을 돌며 레이아웃이 필요하다고 마킹된 뷰컨트롤러에 viewWillLayoutSubviews를 호출하고, 뷰에 layoutSubviews를 호출한다.

이 함수들을 오버라이드하여 커스텀한 레이아웃을 줄 수 있으나, 레이아웃이 컨스트레인트 자체만으로 표현될수 없을때만 하는게 좋다. 

자신의 subtree 바깥의 뷰를 invalidate하지 않는게 좋다

 

이 과정에서 Layout Engine으로부터 서브뷰의 프레임을 복사해와 서브뷰들이 포지션된다.

 

출처

developer.apple.com/videos/play/wwdc2015/219/

developer.apple.com/library/archive/documentation/UserExperience/Conceptual/AutolayoutPG/ModifyingConstraints.html

stackoverflow.com/questions/47823639/why-calling-setneedsupdateconstraints-isnt-needed-for-constraint-changes-or-ani\

www.youtube.com/watch?v=xjArhdrqAn8&feature=youtu.be&t=20m00s