iOS

[iOS] 의도하지 않은 애니메이션이 나타날때, layoutIfNeeded()

Kim_Baechu 2022. 4. 1. 19:51

https://developer.apple.com/documentation/uikit/uiview/1622507-layoutifneeded

 

Apple Developer Documentation

 

developer.apple.com

레이아웃 업데이트를 기다리고 있다면 subview를 즉시 배치합니다.

Discussion

뷰의 레이아웃을 즉시 업데이트할 때 이 메서드를 사용하세요.

오토 레이아웃을 사용중이면, 레이아웃 엔진은 제약조건에 맞게 뷰 위치를 업데이트합니다.

루트 뷰의 메세지를 받는 뷰를 사용중이면, 이 메서드는 루트부터 시작하는 뷰의 서브트리를 레이아웃합니다.

기다리고 있는 레이아웃 없데이트가 없으면, 이 메서드는 레이아웃을 바꾸거나 레이아웃 관련된 콜백을 호출하지 않고 종료됩니다.

 

내용추가

애니메이션이 포함된 뷰를 작성할 때, 의도하지 않은 애니메이션이 생길 때가 있습니다.

컬렉션 뷰의 셀들이 확대되면서 로드된다거나, 프로그레스 뷰가 잘못 움직인다거나..

이럴 때, 애니메이션 전에 내가 의도된 상태로 만들기위해서 layoutIfNeeded를 사용하면 문제를 해결할 수 있습니다.

View Drawing Cycle에 대한 이해가 있으면 쉽게 문제를 파악할 수 있습니다.

https://baechukim.tistory.com/121

 

[iOS] The View Drawing Cycle: 뷰 그리기 사이클

View and Window Architecture https://developer.apple.com/library/archive/documentation/WindowsViews/Conceptual/ViewPG_iPhoneOS/WindowsandViews/WindowsandViews.html#//apple_ref/doc/uid/TP40009503-CH2..

baechukim.tistory.com

 

 

layoutSubviews()

서브뷰의 레이아웃을 정합니다.

이 매서드는 오토리사이징이나 제약기반 행동이 원하는대로 안될 때만 오버라이드해야합니다.

 

직접 호출하면안됩니다. 다음 드로잉사이클에 그리려면 setNeedsLayout()을, 즉시 호출하려면 layoutIfNeeded()를 사용해야합니다.