iOS

viewIsAppearing

Zedd0202 2023. 7. 31. 13:44
반응형

 

WWDC23 What's new in UIKit보다가.. viewIsAppearing 이라는게 새로 나왔더라구요? 

아직 뭔지는 모르지만 살짝 맛있을지도

 

# viewIsAppearing

다들 잘 알고계시다시피 ViewController의 View의 가시성이 변경될때마다 ViewController는 자체 인스턴스 메소드를 호출합니다.

익숙한 3개의 메소드와 이 메소드가 언제 불리는지를 살펴보겠습니다. 

1. viewDidLoad - ViewController의 view가 메모리에 올라가면 불림

2. viewWillAppear - View가 View hierarchy에 추가될 예정임을 ViewController에게 알림

3. viewDidAppear - View가 View hierarchy에 추가되었음을 ViewController에게 알림 

오늘 볼 viewIsAppearing은 viewWillAppear와 viewDidAppear 사이에서 불리게 됩니다. 

그러니까 viewDidLoad ➡️ viewWillAppear  ➡️ viewIsAppearing  ➡️ viewDidAppear 요렇게 되겠죠! 

https://developer.apple.com/documentation/uikit/uiviewcontroller

중요한 특징 중 하나는, View가 추가되고 그 이후에 viewIsAppearing이 호출되게 됩니다. 

 

viewWillAppear는 단순히 View가 추가될 예정을 알리는 메소드이기 때문에, 그 타이밍에는 

view의 size라던가 trait collection 등이 정확하지 않습니다. (아직 view도 추가가 안된 상태여서) 

이와 달리, viewIsAppearing는

1) ViewController의 View를 View hierarchy에 추가하고

2) Superview가 이 View의 배치를 끝낸 뒤에

호출되기 때문에

- ViewController와 View모두 업데이트 된 trait collection을 가지고 있음

- View geometry(size, safe area 등)이 정확함 

이라는 특징을 가지고 있습니다. 

그래서 애플피셜 view가 보일 때(appear) UI를 업데이트 하기 위한 최적의 장소라고 합니다. 

 

Q : viewDidAppear도 view가 추가된 이후에 불리기 때문에 

- ViewController와 View모두 업데이트 된 trait collection을 가지고 있음

- View geometry(size, safe area 등)이 정확함 

잖아?

viewDidAppear는 transition animation이 일어난 후에 마지막 CATransaction에서 불리기 때문에,

transition하는 동안 보이게 하고픈 변화를 보여주기엔 너무 늦은 타이밍입니다. 

 

하지만, 

위 그림을 자세히 보면 viewWillAppear와 viewIsAppearing는 같은 CATransaction내에서 발생하고있습니다. 

그러니까 좀 쉽게 말하면..viewWillAppear와 viewIsAppearing중 아무 메소드에서 변경을 해도 transition의 첫 프레임에서부터 사용자에게 보이게 됩니다.

(viewIsAppearing에서 하면 업데이트 된 trait collection, size등을 기반으로 변경할 수 있겠죠) 

 

Q : viewWillLayoutSubviews() / viewDidLayoutSubviews()는?

view의 layoutSubviews이 실행될때마다 위와같이 ~LayoutSubviews 메소드들이 불리는데요.

이런 친구들은 transition중이나 후에(trait collection이 바뀐다거나) 여러번 불릴 수 있습니다. 

이에 반해 viewIsAppearing은 transition중에 한번만 호출되고 view가 나타날때 레이아웃이 필요하지 않더라도* 호출됩니다. 

(* 그런경우가 있을진 모르겠지만 layoutSubviews같은게 안불려서 ~LayoutSubviews 메소드가 안불리는 경우를 말하는 듯 하다..?)

아무튼 핵심은 여러번 호출될 가능성이 있는 ~LayoutSubviews 와 다르게 viewIsAppearing는 딱 한번만 호출된다는 거!@@@!!

 

viewIsAppearing가 view가 보일 때(appear) UI를 업데이트 하기 위한 최적의 장소인지 아시겠죠?

transition의 첫 프레임부터 변경이 들어가면서도 trait collection이나 size도 다 정확해;;;

맛있다;;

 

# 그럼 언제 viewWillAppear를 사용해야할까

지금 거의 뭐 '엥..? viewWillAppear 그런게 있었나? ㅋ~' 까지 와있는 상태인데요.

viewWillAppear는 언제 사용해야할까요?!?

1. Alongside animations을 추가하기 위해 transitionCoordinator에 접근해야할 때과 같이 view transition이 시작되기 전에 callback이 필요할 때. (Alongside animations는 view controller transition animations과 동시에 수행하도록 프레임워크에 지시하는 애니메이션이 있음)

위에서 말하는 Alongside animations은 

이건듯해요..? 

사실 잘 이해를 못하겠어서 원문도 첨부합니다 ㅎ;

You need a callback before the view transition begins, such as when accessing the transitionCoordinator to add alongside animations. Alongside animations are animations that you direct the framework to perform concurrently with the view controller transition animations.

출처 : https://developer.apple.com/documentation/uikit/uiviewcontroller/4195485-viewisappearing

 

2. View Controller / View traits / hierarchy / geometry등에 의존하지 않는 작업을 수행할 때. 

ex. viewWillAppear - notifications 등록  / viewDidDisappear - notifications 등록 취소

 

애플 문서에 viewWillAppear와의 차이를 잘 정리한 표가 있길래 첨부합니드.. ㅎ

https://developer.apple.com/documentation/uikit/uiviewcontroller/4195485-viewisappearing

 

이렇게 맛있는게 iOS17부터 쓸 수 있으면 너무 마음이 아프겠쬬

iOS 13부터 지원한다는 사실! (사용은 Xcode 15부터 가능합니다) 

 

viewIsAppearing 하나에 이렇게 기쁜 마음이 드는 저를 보면서 순간..

'아니 근데 왜 이제서야 내준거지..?' 하는 생각이 들었.......

iOS ) View Controller의 생명주기(Life-Cycle)  요 글도 수정해야겠군요


[요약]

1. viewWillAppear(_:) 와 viewDidAppear(_:) 의 사이에서 불림

2. view가 보일 때(appear) UI를 업데이트하기 위한 최적의 장소 

3. iOS 13부터 지원 

 

[참고]

https://developer.apple.com/documentation/uikit/uiviewcontroller/4195485-viewisappearing

https://developer.apple.com/videos/play/wwdc2023/10055/

반응형