[ UIKit ] - UIWindow의 역할 (Windows and Screens)

2023. 11. 17. 21:05Mobile/iOS

Window 는 MS 의 운영체제...가 아니고, 창문, 보이는 부분들과 연관 되어 있는 것 같다.

공식 문서를 살펴보니

 

The backdrop for your app's user interface and the object that dispatches events to your views.

 

UIWindow 의 개념을 보니 이러한데 해석을 해보면

  • 앱의 UI 에 대한 배경
  • 이벤트를 뷰에 전달하는 객체

라고 보면 될 것 같다. API Collection 의 분류로 보면 Windows and Screens 인데 영어만 봐도 이게 보이는 뷰

즉, 화면과 연관되어 있다는 것을 어렴풋이 알 수 있을 것 같다.

 

Window Objects act as containers for your app's onscreen content, and screens report the characteristics of the underlying display to your app.

-> 창 개체는 앱 화면의 콘텐츠의 컨테이너 역할을 하며 화면은 기본 디스플레이의 특성을 App 에 보고한다! 라고 되어 있다.

 

뭔가 이벤트, 보이는 것들을 전달해 주는 녀석임에는 틀림없다.

형태는 이러하다

@MainActor
class UIWindow: UIView

 

Windows 는 뷰컨트롤러와 함께 작동하여 이벤트를 처리하고 앱 작동에 기본이 되는 기타 여러 작업을 수행한다.

UIKit 은 대부분의 Window 관련 상호 작용을 처리하며 많은 앱 동작을 구현하는데 필요에 따라 다른 개체와 작업한다.

 

Windows 를 사용하는 경우

  • 앱 콘텐츠를 표시하는 기본 Window 를 제공
  • 추가 컨텐츠를 표시하려면 필요에 따라 추가 Window 를 생성

일반적으로 Xcode 는 앱의 main window 를 제공함. 새로운 iOS 프로젝트는 스토리보드를 사용해 앱의 view를 정의한다. window 스토리보드를 사용하려면 Xcode 템플릿이 자동으로 제공하는 앱 대리자 개체에 속성이 있어야한다.

 

여기서 중요한 것!!

앱에서 스토리보드를 사용하지 않는 경우 이 창을 직접 만들어야 한다.

( 이건 나중에 스토리보드 없이 코드로만 작업하는 경우를 따로 정리해봐야겠다!)

UIWindow 또한 몇가지 다른 작업에도 개체를 사용한다.

  • 다른 Window 에 비해 Window 의 가시성에 영향을 미치는 Window 의 z 축 수준을 설정
  • window 를 표시하고 키보드 이벤트의 타겟을 만듦
  • 좌표값을 window 좌표계로 변환하거나 그 반대로 변환
  • window 의 rootViewController 를 변경
  • window 의 표시되는 화면을 변경

위의 케이스 중 하나인데,

AppDelegate.swift 파일을 보면, 안에 UIWindow 에 대한 변수 설정을 하는경우가 있다. 예를 들어 *앱을 구동하고 초기 뷰 컨트롤러를 설정하는 경우의 코드 ⇒ rootViewController 

@main
class AppDelegate: UIResponder, UIApplicationDelegate {
    var window: UIWindow?
    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
        window = UIWindow()
        window?.rootViewController = TabBarController() // 초기 ViewController
        window?.makeKeyAndVisible()
        return true
    }
}

 

하위 클래스화를 원할 수 있는 몇 가지 경우 중 하나는 Window 의 키 상태를 변경될 때 becomeKey() 또는 resignKey() 메소드를 재정의해 사용자 정의 동작을 구현한다.

특정화면에 창을 표시하는 방법에 대한 자세한 내용은 UIScreen (하드웨어 기반 디스플레이와 관련된 속성의 정의하는 개체)과 연관이 있다.

키보드 상호 작용 이해

터치 이벤트는 발생한 윈도우로 전달되는 반면, 해당 좌표 값이 없는 이벤트는 키 윈도우로 전달된다. 한 번에 하나의 창만 키 창이 될 수 있으며 창의 속성을 사용하여 상태를 확인할 수 있다. 대부분의 경우 앱의 기본 창이 키 창이지만 UIKit 은 필요에 따라 다른 창을 지정할 수 있다.

isKeyWindow 창이 키 창인지 여부를 나타내는 부울 값

어떤 창이 중요한 지 알아야 할 경우 didBecomeKeyNotificationdidResignKeyNotification 을 관찰한다. 시스템은 앱의 주요 Window 변경에 대한 응답으로 이러한 알림(Notification)을 보낸다. 창이 키가 되도록 강제하거나 창의 키 상태를 취소하려면 이 클래스의 적절한 메서드를 호출해라.

관련 메소드

didBecomeKeyNotification : 창이 키 창이 될 때마다 게시되는 알림

didResignKeyNotification : 창이 기본 창으로서 상태를 종료할 때마다 게시되는 알림

형태!

//Window 를 생성하는 것
init(windowScene: UIWindowScene)

// Configuring the window - 창 구성하는 것

var rootViewController: UIViewController? 

var windowLevel: UIWindow.Level 
// z축에서의 윈도우 위치 

struct UIWindow.Level
// 창의 상대적인 위치 
...

 

 

뭔가 더 정리할 부분이나 시도해보는 코드는 수정해봐야겠다.

 

- 피드백 환영입니다.

 

 

참고자료

https://developer.apple.com/documentation/uikit/uiwindow