UIKit과 iOS에서 제일 기본적인
View
에 대해 정리한 포스팅
우선 UIKit에서 UI의 구조는 아래와 같습니다.
그럼 제일 크게 보이는 부분이
1. UIWindowScene
2. UIWindowView
3. UIView
인데 이 부분을 정리할 예정입니다.
일단 UIWindowScene에 대해 알기 전에 Scenes에 대해 알아야합니다.
앱 UI의 여러 인스턴스를 동시에 관리하고, 리소스를 적절한 UI 인스턴스로 전달합니다.
Scene
에는 UI의 한 인스턴스를 표시하기 위한 창과 뷰 컨트롤러가 포함
됩니다.Scene
은 서로 동시에 실행
되어 동일한 메모리와 앱 프로세스 공간을 공유
합니다.UIWindowScene
UIWindowSceneDelegate
앱의 사용자 인터페이스의 한 인스턴스를 나타내는 객체
@MainActor
class UIScene : UIResponder
init(
session: UISceneSession,
connectionOptions: UIScene.ConnectionOptions
)
우리가 스토리 보드를 통해 편집하는 대부분의 ViewController들은 각자 하나씩의 화면을 담당
하고 있다.
화면의 콘텐츠를 표현하고 View를 관리
한다. 이를 Scene
이라고 하는데, 보통 하나의 Scene
을 표현하는데에는 하나의 ViewController
가 사용된다.
만약 두개의 Scene으로 이루어 졌다면, 두개의 ViewController가 필요한 것이다.
UIScene은 UIResponder
의 subclass이며, 사용자의 interaction을 처리하는 역할을 한다.
모든 scene
은 연관된 delegate 객체
를 가지고 있으며, UISceneDelegate 프로토콜을 사용한다. 또한 observer를 등록해서 notification을 보낼 수도 있다. 사용자의 어떤 이벤트던지 간에, delegate 객체 혹은 observer를 이용할 수 있다.
옵셔널 이유 → Scene이 session으로부터 connect/disconnct 될 수 있기 때문
// 현재 세션과 관련된 Scene
var scene: UIScene? { get }
// Scene의 내용이 맡은 역할
var role: UISceneSession.Role { get }
// Scene의 가능한 역할을 나타내는 상수
struct Role
그림과 같이 하나의 UIWindowScene에는 여러개의 Window를 가질 수 있음
// 해당 장면과 관련된 창
var windows: [UIWindow] { get }
// 장면과 연관된 중요한 창
var keyWindow: UIWindow? { get }
// 장면의 내용을 표시하는 화면
var screen: UIScreen { get }
실제로 UIWindowScene
은 windows: [UIWindow]
배열을 가지고 있다.
scene
의 상태가 변화되면, scene 객체는 이의 delegate의 매소드를 호출
하는데, 이때 사용되는 delegate
가 UIWindowSceneDelegate
이다.
우리가 프로젝트를 생성한 후, SceneDelegate 코드를 보면 UIWindowSceneDelegate Protocol을 채택한 것을 볼 수 있다.
class SceneDelegate: UIResponder, UIWindowSceneDelegate
앱의 사용자 인터페이스의 배경이자 뷰에 이벤트를 전달하는 객체입니다.
으로 아래와 같이 확인할 수 있습니다.
윈도우는 디바이스의 스크린을 빈틈없이 채우기 위한 객체
항상 유저 인터페이스 표현 계층의 최상위에 위치
View의 일종이지만, 직접 콘텐츠를 가지고 있지는 않음!
콘텐츠를 가진 View를 내부에 배치하여 화면에 출력하는 역할!
➡️ Window 내부에 배치된 View 콘텐츠만 변경될 뿐,
윈도우 객체 자체는 전환되지 않음
모든 애플리케이션은 최소한 하나 이상
의 Window
를 가지고 있음
앱을 종료하는 경우
에만 사라지게 됨!
대부분의 모바일 디바이스의 디스플레이는 하나뿐임 ➡️ 그래서 윈도우는 하나라고 생각할 수 있음
그러나 만약 외부 디스플레이
가 연결
되는 경우에 하나의 애플리케이션
이지만 두번째 디스플레이
에 콘텐츠를 표현하기 위해 새로운 Window 객체를 생성!
➡️ 아이패드를 사용하는 경우도 마찬가지
공식문서 내용
- 앱의 콘텐츠를 표시하는 주 창을 제공합니다.
- 추가 콘텐츠를 표시하려면 필요에 따라 추가 창을 만듭니다.
대부분의 앱은 하나의 창만 필요로 하며, 이는 기기의 메인 화면에 앱의 콘텐츠를 표시합니다. 기기의 메인 화면에 추가 창을 만들 수 있지만, 추가 창은 일반적으로 연결된 디스플레이에 콘텐츠 표시에서 설명한 대로 외부 화면에 콘텐츠를 표시하는 데 사용 됩니다 .
사용자의 입력에 반응하는 객체
필요한 콘텐츠
를 채워 넣어 스크린에 나타내는 역할
하나 이상의 View 들이 콘텐츠를 표현하면, 윈도우는 이를 모아 디바이스의 스크린에 출력
이때 View들이 서로 영역이 겹치지 않는 퍼즐 형태로 구성이 될 수도 있고
겹쳐지는 경우 중첩된 형태로 표현 되기도 함
1. Window가 최상위에 존재
2. TabBar View가 존재
3. Navigation View가 존재
4. Custom View가 존재
Window에 각 2,3,4번의 View들이 모아져 디바이스의 스크린에 출력되는 형식이다.
쉽게 말해, UIWindow는 액자
이고, UIView는 끼워넣는 그림/사진
이다.
Scenes | Apple Developer Documentation
[iOS] UIWindowScene / UIWindow / UIView
[iOS] 뷰의 계층 구조