본문 바로가기

iOS

[iOS] animate - layout, setNeedsLayout, layoutIfNeeded

레이아웃의 Constraint를 통해서 애니메이션을 할 수 있습니다.

storyboard에서 레이아웃의 constraint를 control을 눌려서 코드로 옮기면 constraint도 IBOutlet이 됩니다.

 

 

자 일단 먼저 layoutSubviews()에 대해 알아볼까요!

 

layoutSubviews()

서브뷰의 레이아웃을 즉시 업데이트 시켜주는 메소드입니다. 호출 되면 해당 뷰의 모든 서브뷰가 layoutSubviews()를 실행합니다. 그래서 이 메서드는 처리량이 많아 직접 호출하는 것은 지양되며 layoutIfNeeded() 메서드 또는 setNeedsLayout() 메서드를 통해 호출 시킵니다.

이 메소드는 시스템에 의해서 뷰의 값이 다시 계산되어야 하는 시점 update cycle에 자동으로 호출됩니다.

update cycle에 레이아웃이 업데이트 되도록 하는 경우

- 뷰의 크기 변경

- 뷰에 서브 뷰 추가

- 스크롤뷰 스크롤

- 디바이스 회전

- 뷰의 오토레이아웃 constraint 변경시

 

그리고 layoutSubviews() 메서드 호출 뒤에 viewDidLayoutSubviews() 메서드가 호출됩니다.

 

 

 

layoutIfNeeded()

레이아웃 설정에 맞게 서브뷰들을 강제로 레이 아웃 시킵니다. 서브뷰의 레이아웃을 즉시 갱신하며 layoutSubviews() 호출합니다.!!

setNeedsLayout과 마찬가지로 수동으로 layoutSubviews를 예약하는 메서드이지만 update cycle이 돌때까지 기다리지 않고 즉시 layoutSubviews()를 호출합니다.

동기

 

 

 

setNeedsLayout()

비용이 가장 적게 드는 방법이고 수동으로 예약을 하는 메서드

이 메서드를 호출한 뷰는 재계산되어야 하는 뷰라고 체크되며 update cycle에 layoutSubviews() 호출한다.

비동기

 

 

위에 동기와 비동기라는 단어에 볼드를 했는데 그 이유를 눈으로 보여드리겠습니다.

 

layoutUfNeeded() 동기!

 

 

 

setNeedsLayout() 비동기!

 

setNeedsLayout은 update cycle에서 비동기로 값을 반환 하기 때문에.. 애니메이션을 사용할 때는 layoutIfNeeded를 사용하여야 합니다.

 

 

P.S

 

모든 애니메이션들의 사용은 오토 레이아웃에 영향이 가서 조심 해서 써야합니다.

'iOS' 카테고리의 다른 글

[iOS] updateCycle  (0) 2021.04.07
[iOS] RunLoop  (0) 2021.04.07
[iOS] animation- transition, keyframe  (0) 2021.04.04
[iOS] animation - animate  (0) 2021.04.04
[iOS] Collection View 컬렉션 뷰  (0) 2021.04.01