setNeedsLayout vs. layoutIfNeeded

betterhee 2021. 8. 31. 14:35

layoutSubviews

뷰의 값을 호출한 즉시 변경시켜주는 메소드.
호출되면 해당 뷰의 모든 하위 뷰들의 layoutSubviews 또한 연달아 호출됨.
이러한 이유로 비용이 많이 드는 메소드이며, 직접 호출하는 것이 지양됨.

자동으로 Update Cycle에 layoutSubviews를 호출하도록 예약하는 이벤트

  • 뷰의 크기 조절
  • 하위뷰 추가
  • 스크롤뷰를 스크롤
  • 디바이스 회전
  • 뷰의 오토레이아웃 제약조건 변경

layoutSubview를 호출하도록 예약하는 메소드 두 가지

  • setNeedsLayout : 비동기적으로 동작하여 바로 반환됨. Update Cycle에 layoutSubviews 호출.
  • layoutIfNeeded : 동기적으로 동작. Update Cycle을 기다리지않고 바로 layoutSubviews 호출.

만일 메인 런 루프에서 하나의 뷰가 (1) setNeedsLayout을 호출한 후 (2) layoutIfNeeded를 호출한다면?
(2) 메소드는 그 즉시 실행되어 뷰의 값이 재계산되고 화면에 바로 반영되기 때문에,
(1)이 예약한 layoutSubviews 메소드는 Update Cycle에 반영해야할 변경된 값이 존재하지 않게됨 = 즉 호출되지 않음

이러한 이유로 layoutIfNeeded는 그 즉시 값이 변경되어야하는 애니메이션에 많이 사용됨.
만일 setNeedsLayout을 사용한다면 애니메이션 블록에서 그 즉시 뷰의 값이 변경되는 것이 아니라 추후 Update Cycle에 값이 반영되므로 값의 변경은 이루어지지만 애니메이션 효과는 볼 수 없다.

setNeedsLayout vs layoutIfNeeded | 이동건의 이유있는 코드
View Programming Guide for iOS | Apple Developer