iOS Tip: setNeedsLayout vs layoutIfNeeded
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에 종속되기 때문이다.