- 세션보면서 정리한 내용입니다. 해석이 잘못된 경우가 있을수있으니 발견하시면 댓글로 남겨주시면 감사하겠습니다🙏🏻
https://developer.apple.com/videos/play/wwdc2015/219/
👍요약
- constraint를 계산하고, layout업데이트한다.
- 이러한 과정은 Render Loop안에서일어나고, 즉각적으로이루어지지않고, 다음 RenderLoop에 실행되어질것이다. RenderLoop는 1초에150번이루어진다.
- layoutSubviews()를 오버라이드할때는 주의해야한다.
- translateAutoresizingMaskIntoConstraints 는 frame을 constraint로 만들어준다. 그럼으로써 constraint를 만들지않아도, 이를 활용할수있다!
- 코드로 cosntraint를 주기위해서는 이를 꺼야한다.
- 디버깅에서도 다양하게확인할수있다.
Layout Cycle

Constraint Changes

Engine은 layout을 재계산한다.
- 새로운 값을 받고, 완료가되면, View는 superview.setNeedsLayout()을 호출한다.
- 이는 스케쥴되기위한 deferred layout pass 를 유발한다.
이때까지는 Engine안에서 값들이 바뀌지만, View Hierarchy에서는 아직안바꼈다.
deferred layout pass가 도착하면, 잘못된view들을 재배치한다.
- 이때 정확히 2가지가일어난다.
- Update constraints.
- Reassign view frame
updateConstraints
- setNeedsUpdateConstraints()를 호출한다.
- 이는 updateConstraint가 필요하다라고 예약함으로써 다음 RenderLoop에 실행되어진다.
- 이것은 거의필요하지않다.
- 왜냐하면, IB안에서 대부분 초기화될것이기때문에
- 또는 프로그래밍으로초기화할경우 viewDidLoad안에서작업하면되기때문에
- 그럼언제사용해야할까?
- 만약,constraint를변경하는것이 너무느리다면, updateConstraints를호출하라.
- 왜냐하면 다른시간대에서가 아닌, updateConstraints안에서 constraint를변경하는것은 빠르기때문에! 왜냐하면 한번에 묶어서engine이처리하기때문
- 이는 constraints의 array를 activate한느것과 같은 이점이다.
그다음
layoutSubviews()
- engine으로부터 값들을 읽어들여 view들을 재배치한다.
- 👍그리고많은사람들이 custom layout에서 layoutSubview를 override하곤한다. 그만큼쉽게overriden할수있으므로 실수할여지가많다. 그러므로조심해야한다
ovrride layutSubview()
- 👍constraint를 사용하여표현되어질수없는경우에만 override해야한다. 즉 constraint으로만 부족한경우에.
- layout을수정하고, super.layoutSuviews를 호출하라.
- 그리고 setNeedsUpdateConstraints를호출하지말라.
Layout Cycle요약
- 👍변경이 즉각적으로 이루어질것이라고 기대하지말라, renderLoop에의해 언젠가실행되어질것이다.
- layoutSubviews()를 override할때는 주의해야한다.
translateAutoresizingMaskIntoConstraints
- constraint를 사용할거면, 이를 꺼야한다.
- 프로그래밍으로만들경우, default로 항상 켜져있는데, 이는 frame을 NSAutoresizingMaskLayoutConstraint로 만들어준다.
- 👍만들어진 A뷰의 constraint를 다른뷰B에서 constraint를적용할때 A의 constraint를 사용할수이따
만약 끄지않고, consrtaint를 적용하면, 두개의constraint가공존하게된다. ( NSAutoresizingMaskLayoutConstraint, NSLayoutConstraint )
- 그러므로충돌이발생하므로 이상한결과를얻게된다.
- 그러므로 frame으로 세팅하고싶다면 사용하라.
- IB또는 코드로 consraints를지정할때는 꺼라.
Creation Constraint
- 위에는 기존Constraint이였는데, 아래로 더 쉽게 개선했다 ( 박수..ㅋㅋ)
- 아래와같이 허용되지않는다.
- 딱봐도 이해가되는 말이안되는것. leading은leading,trailing과같아야한다.

Understanding the Log

아래와같이 바뀌면 더 읽기편하겠다.
- 그러기위해서는 constraint에 identifier를 추가한다.
- IB에서도 identifier에 적어준다
- 아래와같이 해람 .
- constraintsAffectingLayoutForAxis - vertical 1, horizontal 0

log창에서 po 로 사용할수있다.

_autoLayoutTrace
- 이렇게하면, 아래와같이 Ambiguity한 뷰를 확인할수있다.
- 또한 객체 hasAmbiguousLayout 을통해 확인할수도있다.

ALignement Rectangles
- Debug - View Debugging - Show Alignemnt Recatangles
- run하고나서 show alignemnt Recatnagles하면 아래와같이노란색으로보인다.

'WWDC' 카테고리의 다른 글
WWDC 19 - Advances in UI Data Sources (0) | 2021.06.23 |
---|---|
WWDC 19 - Advances in Collection View Layout (0) | 2021.06.23 |
WWDC 18 - High Performance Auto Layout (0) | 2021.06.23 |
WWDC 16 - Understanding Swift Performance (0) | 2021.06.22 |
WWDC 20 - What's new in Swift (0) | 2021.06.22 |