Post

viewDidLayoutSubviews

viewDidLayoutSubviews

viewDidLayoutSubviews는 iOS의 UIViewController 생명주기 메서드 중 하나로, 뷰의 서브뷰들이 레이아웃된 직후 호출된다. 주로 레이아웃 조정이 필요한 작업을 이 시점에 처리한다.

정의

1
2
3
4
5
override func viewDidLayoutSubviews() {
    super.viewDidLayoutSubviews()
    
    // 레이아웃 관련 작업
}

호출 시점

viewDidLoad → viewWillLayoutSubviews → viewDidLayoutSubviews

오토레이아웃이나 frame 수정을 수반하는 변화가 생기면 자동으로 다시 호출됨 화면 회전, 뷰 크기 변경 등에서도 반복 호출됨

주요 사용 예시

1. 서브뷰의 frame 직접 조정

1
2
3
4
override func viewDidLayoutSubviews() {
    super.viewDidLayoutSubviews()
    button.frame = CGRect(x: 20, y: 100, width: view.bounds.width - 40, height: 50)
}

오토레이아웃을 쓰지 않고 frame 기반 레이아웃을 할 경우 이 시점이 적절하다.

2. 동적 레이아웃 조정

컬렉션뷰 셀 사이즈 갱신 스크롤뷰 컨텐츠 크기 갱신 서브뷰 위치/크기 재조정

⚠️ 주의할 점

불필요한 레이아웃 변경은 피해야 함 viewDidLayoutSubviews는 자주 호출되므로, 무의미한 frame 변경은 성능 저하 유발 가능

내부에서 layoutIfNeeded() 호출 → 무한 루프 위험

1
2
3
4
5
6
// ❌ 잘못된 예시
override func viewDidLayoutSubviews() {
    super.viewDidLayoutSubviews()
    view.setNeedsLayout()
    view.layoutIfNeeded()  // 무한 루프 유발 가능
}
This post is licensed under CC BY 4.0 by the author.