---
# System prepended metadata

title: ' viewIsAppearing '
tags: [Swift, "\U0001F4BB TIL"]

---

<h1><center> viewIsAppearing </center></h1>

###### tags: `💻 TIL`,`Swift`
###### date: `2023-12-26T17:21:33.284Z`

> [color=#724cd1][name=데릭]
> [viewIsAppearing Method](https://developer.apple.com/documentation/uikit/uiviewcontroller/4195485-viewisappearing)

# Overview

이전의 view Lifecycle에서는 없던 viewIsAppearing에 대해 학습해보자. WWDC23 What's new in UIKit에서 나오게 되었다.

> 시스템이 뷰 컨트롤러의 뷰를 계층구조에 추가하고 있음을 뷰컨트롤러에 알린다고 한다. 

그전에 아래의 그림을 보면 viewWillAppear(_:)이후에 호출되는 메서드인 것을 확인할 수 있다. 

## 이전 버전의 View Lifecyle

![스크린샷 2023-12-26 오후 1.03.38](https://hackmd.io/_uploads/SyVolCDPa.png)

> viewIsAppearing 메서드가 없던 이전 View Lifecycle
> 
**viewWillAppear**

- View가 계층구조에 추가되기 전에 호출된다.
    - Screen에 보이기 전에 호출
- View의 bounds가 정의되지만 위치는 정의되지 않은 상태이다.

**viewWillLayoutSubviews**

- bounds가 최종적으로 결정된다. 
- ViewController의 subview가 로드될 때마다 호출된다. 

**layoutSubviews**

- sub views를 배치한다.
- 직접 호출되지 않는다.

**viewDidLayoutSubviews**

- ViewController에게 subview들이 설정되었음을 알린다.
- ViewController의 subview가 로드될 때마다 호출된다. 

**viewDidAppear**

- View 계층에 추가되고, Screen에 보이고 난 후 호출된다. 

## viewIsAppearing이 추가된 View Lifecyle

시스템은 viewWillAppear 메서드를 호출 후 뷰 컨트롤러의 뷰가 나타날때 마다 이 메서드를 호출한다. viewWillAppear와 달리 시스템은 뷰 컨트롤러의 뷰를 뷰 계층 구조에 추가한 후 이 메서드를 호출하고 super view는 뷰 컨트롤러의 뷰를 배치한다. 
viewIsAppearing 메서드를 호출할 때까지, 뷰 컨트롤러와 해당 뷰는 업데이트된 trait 컬렉션을 받고 뷰는 정확한 위치 및 크기를 갖고 있다.

이 메서드를 재정의하여 뷰 표시와 관련된 custom 작업을 수행할 수 있다. 예를 들어, 이 메서드를 사용하여 뷰나 뷰 컨트롤러의 trait 컬렉션을 기반으로 뷰를 구성하거나 업데이트 할 수 있다. 또는, 스크롤 위치를 계산하는 데 뷰의 크기와 geometry가 필요한 경우, 뷰가 나타날 떄 선택된 셀이 보이도록 컬렉션 또는 테이블 뷰를 프로그래밍적으로 스크롤을 조정할 수 있다. 

**만약 재정의를 하려면 메서드 내부에 super를 호출해야한다.**

## Choosing the appropriate callback

viewWillAppear 메서드 후에 이 viewIsAppearing 메서드를 호출하지만 두 콜백은 모두 CATransaction 내에서 동일하게 호출된다. 즉, 두 메서드 중 하나에서 변경한 내용이 사용자에게 표시된다.

![스크린샷 2023-12-26 오전 11.40.33](https://hackmd.io/_uploads/B1iXa3PvT.png)

> viewIsAppearing이 추가된 View Lifecycle

Trait과 geometry는 viewWillAppear를 호출할 때는 최신 상태가 아니지만 viewIsAppearing을 호출할 때는 최신 상태이므로 이 메서드를 사용하여 뷰를 업데이트하라.

**viewWillAppear를 사용할 때**

- 애니메이션과 함께 추가하기 위해 transitionCoordinator에 접근할 때는 뷰의 전환이 시작되기 전에 콜백이 필요하다. 뷰 컨트롤러 전환 애니메이션과 동시에 수행되도록 프레임워크에 지시하는 애니메이션도 있습니다.

- 균형 잡힌 콜백이 필요한 이유는 뷰 컨트롤러나 뷰 특성, 계층 또는 geometry에 의존하지 않는 작업을 수행하기 위함이다. 이런 경우, viewWillAppear메서드에서 데이터베이스 Notification을 등록하고 viewDidDisappear메서드에서 등록을 해제할 수 있다. 

그 외의 다른 경우에는 viewIsAppearing 메서드를 사용하여 뷰를 업데이트 하라. 

![스크린샷 2023-12-26 오후 4.20.13](https://hackmd.io/_uploads/B1vnRxdPp.png)

viewWillLayoutSubviews, viewDidLayoutSubviews 같은 layout 메서드들은 layoutSubviews를 실행할 떄마다 여러 번 호출될 수 있다. 
하지만, viewIsAppearing 메서드는 뷰의 외형이 만들어지는 동안 한번만 호출하며, 뷰가 나타날 때 레이아웃이 필요하지 않아도 호출된다. 