본문 바로가기
공부/Apple

[Swift] viewWillLayoutSubviews(), viewDidLayoutSubviews()

by 초코팅촉 2024. 9. 23.
728x90
반응형

이 글은 이전의 [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

 

[iOS] viewWillLayoutSubviews와 viewDidLayoutSubviews

선행 내용 아래 포스팅을 먼저 보고 오시면 좋습니다 ViewController의 Lifecycle을 다룬 내용입니다. [iOS] UIViewController 생명주기(Life Cycle) 알아보기 안녕하세요. 개발하는 정주입니다. 오늘은 "UIViewContr

jeong9216.tistory.com

https://kkimin.tistory.com/117

 

View의 life cycle (layoutsubviews에 대해)

우선 View와 관련된 life cycle을 확인할 필요가 있다. ViewController가 layout 을 잡는 과정이랄까? 우선 layoutifneeded 와 setNeedsLayout의 개념을 이해하고 있다는 가정으로 설명한다. (모르시는분은 애플 공

kkimin.tistory.com

https://motosw3600.tistory.com/6

 

ViewController LifeCycle

loadView() 뷰를 실제로 생성하여 메모리에 로드 스토리보드나 nib(xib)를 사용하지 않는다면 이 메소드를 오버라이드해서 뷰를 만들고 계층을 구성해야된다. viewDidLoad() 화면을 나오기 위해 여러 프

motosw3600.tistory.com

 

728x90
반응형

'공부 > 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