UIView 기준
| 함수 |
호출 시점 |
주로 하는 일 |
비고 |
init(frame:) |
코드로 View 생성 시 |
View 초기 설정 |
초기화 |
init?(coder:) |
Storyboard, Xib 로드 시 |
View 초기 설정 |
초기화 |
layoutSubviews() |
Frame 변경 시 |
서브뷰 레이아웃 재배치 |
AutoLayout 안 쓰거나 커스텀 레이아웃 할 때 주로 사용 |
draw(_:) |
View 다시 그릴 때 |
직접 그래픽 그리기 |
CoreGraphics, 무거움 주의 |
updateConstraints() |
constraints 업데이트 필요 시 |
제약조건 동적 업데이트 |
setNeedsUpdateConstraints() 호출 후 실행됨 |
UIViewController 기준
| 함수 |
호출 시점 |
주로 하는 일 |
비고 |
loadView() |
메모리에 View 로드 시 |
View 직접 생성 (특수 케이스) |
보통 override 안함 |
viewDidLoad() |
View가 메모리에 올라온 직후 |
초기 설정, 데이터 로드 |
가장 많이 쓰는 함수 |
viewWillAppear(_:) |
View 나타나기 직전 |
UI 업데이트, 애니메이션 준비 |
여러 번 호출됨 |
viewDidAppear(_:) |
View 나타난 직후 |
애니메이션 실행, Analytics |
여러 번 호출됨 |
viewWillLayoutSubviews() |
AutoLayout 계산 직전 |
레이아웃 조정, 사이즈 변경 대응 |
frame이 바뀔 때마다 호출 |
viewDidLayoutSubviews() |
AutoLayout 계산 직후 |
서브뷰 레이아웃 보정 |
SafeArea 등 계산 후 처리 |
viewWillDisappear(_:) |
사라지기 직전 |
리소스 정리, 타이머 중지 |
여러 번 호출됨 |
viewDidDisappear(_:) |
사라진 직후 |
상태 저장, 리스너 해제 |
여러 번 호출됨 |
핵심 흐름 요약 (UIViewController 생명주기 + 레이아웃 흐름)
loadView()
-> viewDidLoad()
-> viewWillAppear()
-> viewWillLayoutSubviews()
-> viewDidLayoutSubviews()
-> viewDidAppear()
| View 변경 발생 시 |
처리 순서 |
| bounds / frame 변경 |
viewWillLayoutSubviews() → viewDidLayoutSubviews() |
| constraints 변경 |
updateConstraints() → layoutSubviews() |
개발자가 기억하면 좋은 원칙
- viewDidLoad → 초기 설정
- viewWillLayoutSubviews → 크기 변동 대응
- layoutSubviews → UIView 레이아웃 직접 조정
- draw → 정말 마지막 수단 (CoreGraphics)
- viewDidLayoutSubviews → AutoLayout 반영 후 세팅
- viewWillAppear / viewDidAppear → 화면 갱신 or 애니메이션
- viewWillDisappear / viewDidDisappear → 리소스 해제 or 상태 저장