왜 애니메이션 블럭에서 layoutIfNeeded를 사용할까?

Jongwon Woo
3 min readMar 13, 2020

--

Auto Layout을 사용할 때 애니메이션을 구현하는 방법이다.

WWDC 2012 Session 228 Best Practices for Mastering Auto Layout

그런데 왜 애니메이션 블럭에서 layoutIfNeeded를 사용할까?

우선 애니메이션 블럭은 애니메이션이 될 수 있는 변경사항을 가리킨다. layoutIfNeeded는 뷰의 레이아웃을 즉시 업데이트할 때 사용한다.

애플 문서를 보면 Auto Layout을 사용할 때에 대한 설명이 있다.

“When using Auto Layout, the layout engine updates the position of views as needed to satisfy changes in constraints.”

Auto Layou을 사용할 때, layoutIfNeeded를 호출하면 변경된 제약을 만족하도록 뷰의 레이아웃이 바뀐다.

다시 처음으로 돌아가서 애니메이션 블럭에서 layoutIfNeeded를 사용하면 어떤 일이 일어나는걸까?

layoutIfNeeded 설명에서 ‘변경된 제약을 만족하도록 뷰의 레이아웃이 바뀐다’는 것은 뷰의 frame이 바뀐다는 것이다. 그리고 뷰의 frame은 애니메이션이 가능한 속성이다.

따라서 애니메이션 블럭이 가리키는 변경사항은 뷰의 새로운 frame이 된다. 이제 애니메이션 시스템은 뷰의 원래 frame에서 새로운 frame으로 얼마간의 시간동안 화면상에 변화를 표시한다.

다음 소스 코드로 확인해보자. 이 함수는 버튼을 누르면 뷰의 높이가 300으로 애니메이션되면서 바뀐다.

(1) 뷰의 높이 제약이 바뀐다. 제약은 바뀌었지만 아직 화면에 변화는 없다. (2) UIView.animate를 호출하면 (3) 애니메이션 블럭이 실행되고 layoutIfNeeded가 호출된다. layoutIfNeeded는 변경된 제약을 만족하도록 뷰의 frame이 바뀌도록 만든다. 애니메이션 시스템은 애니메이션의 마지막 상태를 얻었다. 이제 (4)번을 지나 애니메이션 시스템은 처음 상태와 마지막 상태 사이의 변화를 2초간 화면에 그린다.

--

--