iOS Tip: setNeedsLayout vs layoutIfNeeded

Lee young-jun
3 min readNov 1, 2023

--

사실 이름만 봐도 얼추 짐작이 가긴 하는데 좀 더 자세히 알아보자

setNeedsLayout

layout을 업데이트해야 한다고 표시

  • 다음에 그려지기(drawring cycle)전에 layout 계산을 다시해라

여러번 호출해도 한번만 적용된다. (단순한 표시니까 😀)

layoutIfNeeded

view를 즉시 layout을 업데이트하라고 요청

  • 하위 View도 필요하면 업데이트 된다.

이미 최신상태면 아무것도 안한다 (최신인건 어떻게 아는거지? 🤔)

예) 업데이트된 layout에서 view의 frame을 계산하고 싶을때

Drawing Cycle

애플 문서에 나와있듯이 setNeedsLayout은 Custom View를 draw할 때 사용한다.

override func draw(_ rect: CGRect) {
// Drawing code
self.setNeedsLayout()
}

그럼 layoutIfNeeded는 뭘까 setNeedsLayout 처럼 따로 개념문서는 없고 위에 설명 한 것처럼 즉시 업데이트한다고 되어있다.

즉 다른 draw 작업들이 끝나는 것을 기다리지 않고 즉시 변경사항을 UI에 반영하는 것이다.

이게 언제 효과 있을까? Layout Constraint를 변경하거나 animation을 사용할 때 UI가 늦게 반영되는 것을 해결할 수 있다.

실제로 사용했던 코드를 보자

Animation

if animated{
UIView.animate(withDuration: duration) { [weak self] in
self?.layoutIfNeeded();
}
}

Layout Constraint

set(value){
if value{
self.imageView?.isHidden = false;
self.titleLabel?.isHidden = false;

self.layoutIfNeeded();
}
}

draw 함수를 직접 사용하지 않아도 이런 것들은 Draw Cycle에 종속되기 때문이다.

원문

참조

--

--

No responses yet