View 란 무엇인가?
- View는 UIView의 인스턴스이거나 UIView의 하위 클래스의 인스턴스이다.
- 자신을 어떻게 그리는지 알고 있다.
- 터치와 같은 Event를 처리할 수 있다.
- 뷰 계층 구조상에 존재한다.
- View들의 Root는 Application의 Window이다.
프로젝트의 View Hierarchy를 보면 UIWindowScene, UIWindow, UIViewController, UIView 등이 계층적으로 생성된 걸 볼 수 있다.
관리
AppDelegate (~ iOS 12)
iOS 12 까지는 Window 관리를 AppDelegate에서 하였습니다.
프로젝트를 생성후에, AppDelegate에 프로퍼티로는 var window: UIWindow? 가 있었죠.
SceneDelegate (iOS 13 ~)
iOS 13 부터는 Window 관리를 SceneDelegate에서 합니다.
여러개의 window를 사용할 수도 있다고 합니다.
이전 App Life Cycle 포스팅에서 SceneDelegate에서는 여러개의 Scene을 사용할 수 있다고 언급했었다.
그렇다면 Window랑 Scene은 같은 개념인 것인가?
여러개의 Scene
이 상황에서는 3개의 Scene이 존재한다.
각각의 Scene들에 대해 SceneDelegate를 통해 Life Cycle을 관리할 수 있다.
UIWindowScene
- UIScene의 서브 클래스로 App의 하나 이상의 Window를 관리한다.
- 직접 생성하면 안된다. 대신 configuration time에 원하는 UIWindowScene에 대해 명시하라고 한다.
- 방법으로는 info.plist의 scene configuration details 부분에 원하는 UIWindowScene의 Class 이름을 넣으면 된다고 한다.
그림과 같이 하나의 UIWindowScene에는 여러개의 Window를 가질 수 있다.
프로퍼티로는 [UIWindow] 와 UIScreen이 있다.
또한, UISceneDelegate를 채택하는 Protocol인 UIWindowSceneDelegate가 존재한다.
우리가 프로젝트를 생성한 후, SceneDelegate 코드를 보면 UIWindowSceneDelegate Protocol을 채택한 것을 볼 수 있다.
class SceneDelegate: UIResponder, UIWindowSceneDelegate
UISceneSession
App의 Scene들 중 하나의 Scene에 대한 정보를 갖고 있는 객체이다. 그래서 내부에 scene이라는 프로퍼티가 존재한다.\
옵셔널인 이유는 scene이 session으로부터 connect/disconnect 될 수 있기 때문인 것 같다.
UIWindow
App의 UI에 대한 배경과 Event를 View에 전달하는 객체이다.
class UIWindow: UIView
Window들은 VC와 함께 작동하여 EVent를 처리하고, App 작업의 기본이 되는 다른 작업들을 수행한다.
사용하는 경우는 아래와 같다.
- App의 컨텐츠를 표시할 기본 Window를 제공한다.
- 추가 컨텐츠를 표시할 때, 필요한 경우 추가 Window를 생성한다.
쉽게 말해, UIWindow는 "액자"이고, UIView는 끼워넣는 그림/사진이다.
UIWindowScene객체를 이용해서 앱의 UI를 관리함
UIWindowScene은 UIScene을 상속받은 class이다.
-> 위에서 3개의 Scene을 가진 메모 Application인 경우, 3개의 Scene(WindowScene) 인 것 같음...
(WindowScene vs Scene 에 대한 얘기가 전혀 없다..)
scene은 여러개의 window들과 view controller들을 포함하며 하나의 UI의 인스턴스를 표현
각 scene은 UIWindowSceneDelegate객체를 가지고 있음 (각 same memory를 공유하며 동기화)
'iOS' 카테고리의 다른 글
[iOS] UIView / 레이아웃 업데이트 관련 메소드 (0) | 2021.05.24 |
---|---|
[iOS] View LifeCycle (0) | 2021.05.24 |
[iOS] HitTest (0) | 2021.05.21 |
[iOS] Responder / Responder Chain (0) | 2021.05.21 |
[iOS] State Preserving/Restoring ViewControlle (0) | 2021.05.20 |