[iOS] iOS 뷰 계층 구조
UIWindowScene
https://developer.apple.com/documentation/uikit/uiwindowscene
UIWindowScene | Apple Developer Documentation
A scene that manages one or more windows for your app.
developer.apple.com
앱의 하나 이상의 UIWindow를 관리하며 UIScene을 상속 받고 있기 때문에 관련 메서드 및 프로퍼티에 접근 가능하다.
windows - window는 여러 개 가질 수 있다.
keyWindows - 윈도우가 여러개 존재할 때 가장 앞쪽에 배치된 윈도우이다.
screen - 화면에 보이는 그 자체(UIScreen 객체이니 hardward 영역인 것 같음)
UIScene 및 UIWindowScene 모두 delegate를 지니고 있으며 scene의 상태가 변경되면 scene 객체는 delegate에 알리며
Scnen의 생명주기 이벤트에 적절하게 반응할 수 있도록 한다.
class SceneDelegate: UIResponder, UIWindowSceneDelegate {
var window: UIWindow?
}
UIWindow
UIWindow는 UIView를 상속 받고 있지만 직접 content을 가지지 않는다. content을 가진 UIView를 배치하여 화면에 출력한다.
화면이 전환되더라도 Window 내부에 배치된 UIView가 변경될 뿐 Window는 변경되지 않는다.
앱을 종료하는 경우에만 사라진다.
UIViewController
위에서는 UIWindow에서 View를 내부에 배치한다고 하였다. 하지만 정확하게는 UIViewController를 통해 View를 관리한다.
window = UIWindow(frame: UIScreen.main.bounds)
window?.rootViewController = MyViewController()
window?.makeKeyAndVisible()
UIWindow - UIViewController - UIView 관계로 UIViewController가 둘 사이를 중계하는 구조이다.
UIWindow는 UIViewController를 통해 제공되는 View를 참조할 뿐 View를 직접 관리하지 않는다.
UIViewController의 main view (VC에서 self.view)를 window의 subView로 함
UIView
content를 화면에 표시하고 사용자로부터 이벤트를 받는다.
iOS에서 뷰를 계층적으로 관리하는 구조를 알고 싶었다.
1. 앱 마다 UIApplication 인스턴스 하나가 싱글톤으로 생성된다.
1-1. UIApplication의 UIApplicationDelegate가 UISceneSession을 생성한다.
2. UISceneSession(UIApplication)은 UIWindowScene을 관리한다.
2-1 두개 이상의 UIWindowScene도 관리 가능 - 멀티 윈도우
2-2. 멀티 윈도우는 여러 개의 UIWindowScene을 가짐으로써 가능하게 됨 ex) iPad에서 두 개의 사파리 브라우저 실행
3. UIWindowScene은 여러 개의 UIWindow를 관리한다.
4. UIWindow마다 UIViewController를 가진다.
5. UIViewController는 UIView를 관리한다.
UIAppllication은 iOS 시스템이 관리한다. (스프링보드, 커널, 런처 등..)