이 글은 이전의 [Swift] Update Cycle에서 이어집니다.
이번에는 UIViewController의 생명주기안에 있는 viewWillLayoutSubviews, viewDidLayoutSubviews에 대해 알아보고자 합니다.
제가 이걸 알고 찾아보게 된 게 커스텀 세그먼트를 만들고 다크모드에 대응하면서부터였는데요,
커스텀 세그먼트를 만들 때 그냥 만들었는데 다크모드를 갔다 오니까 제가 만든 세그먼트가 아래처럼 작동하더라고요?
뭔가 값이 초기화된 건가? 해서 무작정 챗지피티한테 물어보니 다음과 같은 답변을 주더라는 겁니다.
다크모드와 라이트모드를 왔다 갔다 할 때 뷰가 다시 렌더링 된다고 하더라고요.
이 친구는 저기있는 `viewDidLayoutSubviews()`를 쓰라고 하더라고요.
그래서 찾다보니 viewDidLayoutSubviews 만 있는게 아니라 viewWillLayoutSubviews도 있고
layoutSubviews도 있는데 얘는 UIView 메서드이면서 동시에 Update Cycle에 속해있고‧‧‧‧
해서 우선 layoutSubviews를 먼저 설명드리는게 맞는거같아 바로 이전글에서 설명을 했구요,
이 글은 해당 내용을 공부하면서 나머지 두 메서드를 정리한 내용입니다.
기초적인 설명
viewWillLayoutSubviews()와 viewDidLayoutSubviews()는 UIViewController 클래스에 속해 있는 메서드입니다.
이 둘은 보시는것처럼 Subview들의 배치(layout)와 관련된 메서드들입니다.
실행시기
viewWillLayoutSubviews와 viewDidLayoutSubviews는 에서 다음과 같은 위치에 들어갑니다.
viewWillAppear()
------------------------
viewWillLayoutSubviews()
layoutSubviews()
viewDidLayoutSubviews()
------------------------
viewDidAppear()
메서드의 소속에 상관없이 실행되는 순서에 따르면 대략적으로 저렇게 위치한다고 합니다.
앞선글에서 설명했듯이 layoutSubviews에서 해당 뷰와 서브뷰들을 전부 위치와 크기를 정하는 메서드입니다.
그리고 이 글에서 설명하고자 하는 메서드 두개는 이름에서 알수 있다싶이 각각 전과 후에 실행되는 메서드죠.
viewWillLayoutSubviews()
뷰와 뷰에 속해있는 서브뷰들의 레이아웃이 변경되기 직전에 호출되는 메서드.
아래의 경우에 사용합니다.
- 뷰의 추가, 제거.
- 뷰의 layout에 해당하는 요소(크기, 위치)를 갱신.
- 제약조건(Constraints)의 업데이트.
viewDidLayoutSubviews()
뷰와 뷰에 속해있는 서브뷰들의 레이아웃의 배치가 완료된 후 호출되는 메서드.
아래의 경우에 사용합니다.
- 뷰들의 위치나 크기의 최종 조정 혹은 위치나 크기값에 기반해 다른 작업을 할 때.
예상보다 더 크게 그려질 수 도 있으니까 그런것들을 포함해서 레이아웃을 직접 다시 잡아주는 경우가 되겠죠?
- 애니메이션을 적용해 나타내고 싶을 때.
위치나 크기가 정해진 뒤니까 애니메이션이 없다면 그냥 띡 하고 나타날텐데 필요에 따라서 애니메이션을 넣어주면 더 있어보이게 할 수도 있습니다.
- 디버깅 목적으로 사용.
제가 겪었던것처럼 뭔가 이상하게 동작하고 있다면 디버깅을 위해 각 뷰들의 정보들을 출력해 볼수도 있습니다.
이상으로 끝입니당~
다음의 글을 참고하여 작성되었습니다.
https://jeong9216.tistory.com/473
https://kkimin.tistory.com/117
https://motosw3600.tistory.com/6
'공부 > Apple' 카테고리의 다른 글
[Swift] frame과 bounds (0) | 2024.10.19 |
---|---|
[UIKit] navigationbar 숨기기와 보이기 (0) | 2024.09.24 |
[Swift] Update Cycle (0) | 2024.09.22 |
[UIKit] 다크모드, 라이트 모드 고정 (0) | 2024.09.01 |
[UIKit] UITextView placeholder (0) | 2024.08.13 |