[iOS] 뷰의 계층 구조

ellyheetov·2022년 8월 4일
3
post-thumbnail

가끔 뷰를 디버깅 하다보면, 뭔 계층이 참 많다.

나는 ViewController에 몇가지 View를 추가 했을 뿐인데, UIWindow, UIWindowScene 등등 뭐가 이렇게 많을까?

iOS의 View는 어떤 구조로 되어있는 지 궁금해서 알아보기로 했다.

시작하기

처음 Xcode에서 프로젝트를 생성하고, 실행하면 다음과같은 뷰 계층을 볼 수 있다.
스크린샷 2022-08-04 오후 2 01 49

UIWindow

윈도우는 디바이스의 스크린을 빈틈없이 채우기 위한 객체로, 항상 유저 인터페이스 표현 계층의 최상위에 위치한다. View의 일종이지만, 직접 콘텐츠를 가지고 있지는 않는다. 콘텐츠를 가진 View를 내부에 배치하여 화면에 출력하는 역할을 한다.

화면 전환이 되더라도 단지 Window 내부에 배치된 View 콘텐츠만 변경될 뿐, 윈도우 객체 자체는 전환되지 않는다.

모든 애플리케이션은 최소한 하나 이상의 Window를 가지고 있고, 앱을 종료하는 경우에만 사라지게 된다.

하나 이상의 Window를 가진다고?

iOS에서 실행되는 모든 애플리케이션을 최소한 하나 이상의 Window 와 View 가 존재한다.

대부분의 경우에서 모바일 디바이스의 디스플레이는 하나뿐임으로 애플리케이션이 생성하는 윈도우는 하나라고 생각할 수 있다. 그러나 만약 외부 디스플레이가 연결되는 경우에는 하나의 애플리케이션이지만 두번째 디스플레이에 콘텐츠를 표현하기 위해 새로운 Window 객체를 생성한다. 아이패드를 사용하는 경우에도 마찬가지이다.

UIView

View는 콘텐츠를 담아 이를 스크린 상에 표시하고, 사용자의 입력에 반응하는 객체이다. 윈도우의 일부를 자신의 영역으로 정의하고, 여기에 필요한 콘텐츠를 채워넣어 스크린에 나타내는 역할을 한다. 또한, 동시에 윈도우로부터 전달된 사용자의 입력에 반응하여 그에 맞는 결과를 처리한다.

하나 이상의 View들이 콘텐츠를 표현하면, 윈도우는 이를 모아 디바이스의 스크린에 출력한다.

이때, View들이 서로 영역이 겹치지 않는 퍼즐 형태로 구성이 되기도 하며, 겹쳐지는 경우 중첩된 형태로 표현되기도 한다.

UIViewController

Window와 View는 ViewController를 통해 연결 될 수 있다.

ViewController는 View의 계층을 관리하여, Window에 전달하고, 모바일 디바이스에서 감지된 touch event를 Window로 부터 전달받아 처리하는 역할을 한다.

View의 관리는 ViewController의 몫이다.

Window가 View를 직접 참조하지 않고 ViewController가 그 사이를 중계하는 구조 덕분에 Window는 ViewController를 통해 제공되는 View를 읽어들여 표현할 뿐, View를 직접 관리하지 않아도 된다.

UIScene

우리가 스토리 보드를 통해 편집하는 대부분의 ViewController들은 각자 하나씩의 화면을 담당하고 있다. 화면의 콘텐츠를 표현하고 View를 관리한다. 이를 Scene이라고 하는데, 보통 하나의 Scene을 표현하는데에는 하나의 ViewController가 사용된다.

만약 두개의 Scene으로 이루어 졌다면, 두개의 ViewController가 필요한 것이다.

UIScene은 UIResponder의 subclass이며, 사용자의 interaction을 처리하는 역할을 한다. 모든 scene은 연관된 delegate 객체를 가지고 있으며, UISceneDelegate 프로토콜을 사용한다. 또한 observer를 등록해서 notification을 보낼 수도 있다. 사용자의 어떤 이벤트던지 간에, delegate 객체 혹은 observer를 이용할 수 있다.

UIWindowScene

UIScene의 subclass로 애플리케이션의 하나 이상의 window를 관리한다.

실제로 UIWindowScenewindows: [UIWindow] 배열을 가지고 있다.

scene의 상태가 변화되면, scene 객체는 이의 delegate의 매소드를 호출하는데, 이때 사용되는 delegate가 UIWindowSceneDelegate이다.

View의 계층구조

ViewController는 수 많은 View로 이루어진다. 각각의 View는 자기 자신을 스크린 상에 표시하기도 하지만, 동시에 다른 View 객체를 포함하는 컨테이너의 역할도 수행한다. 이를 View의 계층구조라고 한다.

View의 계층 구조상 다른 View를 포함하고 있다면, SuperView(슈퍼 뷰)가 되는 것이고, SuperView에 포함된 View는 SubView(서브 뷰)가 된다.

정리

  • UIView : 콘텐츠를 담아 이를 스크린 상에 표시하고, 사용자에 입력에 반응한다.
  • UIWindow : 콘텐츠를 가진 뷰를 내부에 배치하여 화면에 출력하는 역할(view에 일종, but 직접 콘텐츠를 가지지 않는다.)
  • UIViewController : 윈도우와 뷰 사이를 중계한다.
  • UIScene : 화면의 컨텐츠를 표현하고, View를 관리한다.
  • UIWindowScene : 하나 이상의 window를 관리한다.

Reference

  • 꼼꼼한 재은씨의 Swift: 실전편
profile
 iOS Developer 좋아하는 것만 해도 부족한 시간

0개의 댓글