[iOS] UIWindow

Youngwoo Lee·2021년 11월 25일
0

iOS

목록 보기
37/46
post-thumbnail

들어가며

AppDelegate 혹은 SceneDelegate에서 프로퍼티로 설정되어 있는 것을 볼 수 있는 window 프로퍼티의 타입은 UIWindow이다. 해당 프로퍼티가 언제 쓰이며, 어떤 역할을 수행하는지 알아보자!

UIWindow

class

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

UIWindow는 App UI에 대한 배경과 Event를 다른 View들에게 발송하는 객체이다.

Declaration

@MainActor class UIWindow: UIView

Overview

window는 뷰컨트롤러와 함께 이벤트를 처리하고 앱 작동에 필수적인 작업들을 수행합니다. UIKit은 window와 관련된 상호작용들을다루며, 앱의 동작을 수행하는데 필요한 객체들과 함께 작동합니다.

windows는 아래와 같은 경우에 사용됩니다.

  • main window를 제공하여 앱의 컨텐츠를 표시하는 경우
  • 필요에 따라 window를 추가적으로 생성하여 컨텐츠를 표시하는 경우

보통 Xcode는 앱의 main window를 제공한다. 새로운 iOS 프로젝트에서는 앱의 view들을 정의하기 위해서 스토리보드를 사용한다. 스토리보드들은 AppDelegate에서 window 프로퍼티의 존재를 요구한다. Xcode에서는 자동적으로 이것을 제공한다. 만약에 스토리보드를 사용하지 않고 프로젝트를 진행한다면, window 객체를 직접 생성해야 합니다.

대부분의 앱에서는 기기의 메인 화면에 컨텐츠를 표시할 window가 하나만 필요하다. 기기의 메인 화면에 추가로 window를 생성할 수 있지만 일반적으로 외부 화면에 컨텐츠를 나타내는데 추가된 창이 사용된다. 해당 내용은 Displaying Content on a Connected Screen에서 확인할 수 있다.

UIWindow 객체를 다음 아래 작업들에서 사용합니다.

  • 다른 window와의 상대적인 가시성에 영향을 주는 window의 z-axis level을 설정할 때
  • window를 표시하고 keboard event의 대상으로 지정
  • 좌표 값을 window의 좌표계로 변환
  • window의 rootViewController를 바꿀 때
  • window가 표시되는 화면(screen) 변경

window는 자체적으로 시각적인 외형을 가지고 있지 않다. 대신에, window는 하나 이상의 view를 호스트 하며, 그 view들은 window의 rootViewController에 의해서 관리됩니다. 스토리보드에서 rootViewController를 설정하고, 인터페이스에 적절하게 view들을 추가하세요.

UIWindow Subclass는 거의 필요하지 않습니다. window에서 구현할 수 있는 동작의 종류는 일반적으로 상위 수준 ViewController에서 더 쉽게 구현할 수 있습니다. Window의 key 상태가 변경될 때 사용자 지정 동작을 구현하기 위해 becomeKey() 혹은 resignKey() 메소드를 재정의하는 것이 window의 subclass를 원하는 수 많은 이유 중 하나일 것이다. 특정 화면에 Window를 표시하는 방법에 대한 자세한 내용은 UIScreen을 참고하세요.

Understanding Keyboard Interactions

터치 이벤트가 발생한다면, 터치 이벤트가 발생된 window로 잘 전달되지만, 좌표가 없는 이벤트는 key window로 전달된다. 한번에 하나의 window만 key window가 될 수 있으며 window iskeyWindows 프로퍼티를 사용하여 상태를 확인할 수 있습니다. 대부분의 경우 앱의 main window는 key window이지만 UIKit은 필요에 따라 다른 window를 지정할 수 있습니다.

어떤 window가 key window인지를 알아내려면 didBecomeKeyNotificaitondidResignKeyNotification notificaiton을 관찰하세요. 시스템에서는 앱의 key window 변경에 대한 알림을 보낼 것입니다.


요약 및 정리

  • window 객체는 view들의 배경이자 컨테이너이지만 실제로 외형을 가지지는 않는다. rootViewController를 통해서 view들을 관리한다.
  • window를 subclass해서 구현하는 것은 거의 사용하지 않을 것이다. 그냥 ViewController에서 구현해라
  • 대부분의 앱들은 Window를 하나만 사용하지만 필요에 따라, 외부 화면을 사용하기 위해 Window를 추가할 수 있다.
  • key window가 좌표 없는 이벤트를 받는데, "key window는 항상 main window 이다"라고 확정지을 수는 없다. 그러니 isKeyWindow 프로퍼티를 통해서 확인해라.

한 줄 요약
UIWindow 의 역할은 UIKit 에서 이벤트를 수신하고, 관련된 이벤트를 루트 뷰 컨트롤러 및 관련 뷰에 전달하는 것입니다.

profile
iOS Developer Student

0개의 댓글