[iOS] UIScreen, UIWindowScene, UIWindow, UIView

Martin Kim·2021년 8월 13일
0

iOS

목록 보기
6/11

SceneDelegate.swift

  • 지난번 글에서 정리했다시피 iOS 13 이후부터 SceneDelegate.swift 파일은 UI LifeCycle을 맡아 관리하는 파일이다. 이 파일을 이용해 내가 자주 쓰는 작업은 다음과 같다.
// SceneDelegate.swift
func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) {
        // Use this method to optionally configure and attach the UIWindow `window` to the provided UIWindowScene `scene`.
        // If using a storyboard, the `window` property will automatically be initialized and attached to the scene.
        // This delegate does not imply the connecting scene or session are new (see `application:configurationForConnectingSceneSession` instead).
        guard let windowScene = (scene as? UIWindowScene) else { return }
        self.window = UIWindow(windowScene: windowScene)
        
        let rootViewController: ViewController = ViewController()
        let navigationController: UINavigationController = UINavigationController(rootViewController: rootViewController)
        
        self.window?.rootViewController = navigationController
        self.window?.makeKeyAndVisible()
        .
        .
        .
  • 사실 위와 같이 작업하는데 이해가 안가는 부분이 많았다. iOS 13이후부터 window개념이 scene개념으로 대체되었다는데 음? windowScene이라는건 뭐지.... 그래서 UI 구조가 어떻게 되어있는지 확실히 개념을 잡고자 인터넷을 뒤져봤다. 제일 밑에 하드웨어와 가까운 순으로 UIScreen부터 살펴봅시다.

UIScreen

  • 하드웨어 기반의 디스플레이와 관련된 프로퍼티들을 정의한 최상위 객체
  • 이 클래스를 이용해서 장치에 올려진 스크린 객체를 얻고 사용(?)하세요
  • 찾아보니까 주로 이 클래스를 이용해서 앱을 실행한 디바이스의 화면 크기 같은 정보를 얻는것 같음 ex) UIScreen.main.bounds

UIWindowScene

  • 1개 또는 그 이상의 Window를 포함한 앱의 UI를 관리하는 객체. UIScene의 서브클래스다.
  • Scene객체는 사용자 디바이스 위의 Window를 표시하는 것과 사용자와 상호작용하는 scene의 생명주기를 관리하는 객체라고 합니다.
  • Scene의 상태가 바뀌면 Scene객체는 그것의 UIWindowSceneDelegate를 채택한 delegate 객체에 알린다고 합니다.
  • 해당 UIWindowScene객체는 직접적으로 create하지 말라고 합니다. 대신에 Info.plist 파일에 해당 scene을 위한 클래스 이름을 포함해 설정 세부사항을 기술함으로써, UIWindowScene객체를 configuration time에 명시하라고 합니다. (발영어 죄송합니다ㅋㅋ)
  • windows(UIWindow의 배열), scene 두가지의 프로퍼티를 갖고있다.

UIWindow

  • 뷰 컨트롤러와 함께 일하는데 이벤트 핸들링과 앱의 작업 기 기초인 다른 작업을 수행하는데 한다고 한다. UIKit는 대부분 이 Window에 관련된 상호작용을 핸들링하는데,
  • 우리는 오직 다음과 같은 경우에만 window들을 사용할 수가 있는데,
    • 첫째는 앱 컨텐츠를 표시하는 메인 윈도우를 제공할 때와,
    • 부가적인 컨텐츠를 표시하기 위한 추가적인 windows를 생성할 때. 두가지이다.
  • 보통 Xcode는 앱의 main window를 제공한다. 스토리보드를 사용하는 새로운 iOS 프로젝트는 앱의 뷰들을 정의한다. 스토리보드는 Xcode 템플릿이 자동으로 제공하는 app delegate 객체에 존재하는 window 프로퍼티를 요구한다...?? 이거 뭔가 잘못된것 같다. SceneDelegate 파일에 window 프로퍼티가 있던데... 업데이트가 안된 것 같다.
  • 만약 앱이 스토리보드를 사용안하면 이 window를 생성해야 한다.
  • 대부분 앱은 앱의 컨텐츠를 장치의 메인 스크린에 표시할 수 있는 하나의 윈도우를 필요로 한다. 그럼에도 불구하고~ 디바이스의 메인 스크린에 추가적인 window들을 생성할 수 있는데, 추가적인 window들은 보통 외부 screen의 컨텐트를 표시하기 위해 사용된다.

UIView

  • 우리가 작성하는 바로 그 커스텀 뷰들은 대부분 UIView를 상속해서 만들어진다. (UIViewController, UIScrollView, UICollectionView, UIImageView, ......)
profile
학생입니다

0개의 댓글