Dev.YoungKyu
YoungKyu's Devlog
전체 방문자
오늘
어제
  • 분류 전체보기
    • 부스트캠프
    • iOS
    • visionOS
    • Backend
    • 알고리즘
    • CS
    • Git
    • Python
    • 끄적끄적

블로그 메뉴

  • 홈
  • 🌝 티스토리 홈
  • ⭐️ 깃허브
  • 태그

공지사항

인기 글

최근 댓글

최근 글

태그

  • 알고리즘
  • ImageResource
  • image
  • Optional
  • CS
  • 소프트웨어 공학
  • 오블완
  • 부스트캠프
  • boj
  • ios
  • if let
  • Concurrency
  • 모듈화
  • AutoLayout
  • 소프트웨어공학
  • AVAudioSession
  • constraint
  • SwiftUI
  • 소프트웨어 테스트
  • alamofire
  • guard
  • MVC
  • swift
  • jekyll
  • 티스토리챌린지
  • Git
  • 백준
  • Python
  • Swift5.7
  • authenticationinterceptor

티스토리

hELLO · Designed By 정상우.
Dev.YoungKyu
UIScene, UIWindowScene, UIWindow
부스트캠프

UIScene, UIWindowScene, UIWindow

2024. 8. 22. 17:15

 

iOS 13 이후 SwiftUI 발표와 함께 아이패드에서 스플릿뷰를 통해 멀티 윈도우를 지원하게 되면서,
SceneDelegate, Scene 이란 개념이 생겨났다고만 알고 있었습니다.
프로젝트를 할 때마다 window 와 scene에 대한 정확한 개념이 없어서 대충 이런거겠거니.. 하고 사용했었는데, 이번에 제대로 짚고 넘어가보려고 합니다.

UIWindow, window

window 는 UIWindow의 인스턴스 입니다.
window의 역할은 아래와 같습니다.

  • 앱에 표시되는(visible) contents를 포함한다.
  • 뷰 및 기타 app object에 touch event 전달하는데 중요한 역할을 한다.
  • app의 view controller와 상호작용하여 orientation 변경(화면 회전)을 처리한다.
  • UIKit 에서 event를 수신하고, 관련 event를 root view controller 및 관련 view에 전달한다.

Window-based (~ iOS 12)

scene을 알아보기전에 scene 이전의 구조를 알아볼 필요가 있는데요.

모든 View의 최상위 hierarchy에는 window가 있었습니다.
앱이 실행될 때 window가 생성되고, window 위에 rootViewController가 올라가는 형태였습니다.
이때 까지는 멀티 윈도우를 지원하지 않았기에, 아이폰 아이패드 모두 싱글 윈도우 앱이었고, window가 하나만 존재하는 구조였습니다.

이미지 출처: https://noah-ios.dev/window-scene/

이미지 출처: View Controller Programming Guide for iOS

Window Scene-Based (iOS 13 이후)

iOS 13 이후 어떻게 바뀌었을까요?

 

멀티 윈도우를 지원함에 따라, 하나의 앱이 여러개의 창을 띄울 수 있게 되었습니다.
여기서 말하는 창은 UIScene 이 됩니다.

 

먼저 iOS 17.4로 빌드한 화면의 hierarchy를 확인해보겠습니다.
최상위에 UIScene이 아닌 UIWindowScene이 있네요.
이게 무슨일일까요?

UIScene, UIWindowScene

UI를 보여줄 창을 만들 때 UIWindowScene 객체를 만들게 되는데요.

 

UIWindowScene 객체는 UIScene을 상속받고 있기 때문에, UIWindowScene 에서 UIScene의 메소드 및 프로퍼티에 접근이 가능합니다.

 

그리고 UIScene과 UIWindowScene 은 모두 delegate를 가지고 있고, scene 의 상태가 변함에 따라 해당하는 delegate 메소드를 호출함으로써 scene lifeCycle 이벤트에 적절히 반응할 수 있도록 해줍니다.

 

이것이 바로 SceneDelegate 입니다.
SceneDelegate 는 넘어가겠습니다.

 

이건 iOS 12 이전의 UI 구조이고

이건 iOS 13 이후 UIWindowScene 기반의 UI 구조입니다.

 

이제 조금 이해가 되는 것 같습니다 !

 

iOS 13 이후, 하나의 앱에 여러 개의 창을 띄울 수 있게 되었습니다.(멀티 윈도우)
UIScene 이 하나의 창 역할을 하고, 구현을 할 땐 UIScene을 상속받는 UIWindowScene 을 통해 구현하게 됩니다.
그리고 하나의 창 (UIWindowScene)에 여러 UIWindow 를 띄울 수 있게 된겁니다.

iOS12 이전에도 UIScreen 위에 UIWindow가 여러개 떠있는데 이건 멀티윈도우 아님?

iOS12 이전에 UIWindow를 여러개 띄우는 건 하나의 UIScreen 위에 키보드나 알림창 같은 시스템 윈도우를 오버레이할 순 있었지만, 원하는 앱을 여러 멀티 윈도우로 띄울 순 없었습니다.

저작자표시 (새창열림)

'부스트캠프' 카테고리의 다른 글

네이버 부스트캠프 웹・모바일 9기 멤버십 과정 2차 학습스프린트 회고  (2) 2024.10.19
네이버 부스트캠프 웹・모바일 9기 멤버십 과정 1차 학습스프린트 회고  (0) 2024.09.20
IBOutlet과 IBAction  (2) 2024.08.21
View(ViewController) Life Cycle  (1) 2024.08.21
네이버 부스트캠프 웹・모바일 9기 챌린지 과정을 마치며  (0) 2024.08.11
    '부스트캠프' 카테고리의 다른 글
    • 네이버 부스트캠프 웹・모바일 9기 멤버십 과정 2차 학습스프린트 회고
    • 네이버 부스트캠프 웹・모바일 9기 멤버십 과정 1차 학습스프린트 회고
    • IBOutlet과 IBAction
    • View(ViewController) Life Cycle
    Dev.YoungKyu
    Dev.YoungKyu
    iOS를 공부하고 있습니다

    티스토리툴바