UIWindow는 무엇일까?

zeke·2021년 7월 11일
2

UIKit

목록 보기
5/8
post-thumbnail

AppDelegate나 SceneDelegate 클래스에서 볼 수 있는 window속성, 이 window는 무엇이고 어떤 역할을 할까?

UIWindow

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

UIWindow는 앱의 UI와 뷰의 이벤트를 처리하는 객체의 배경입니다.

Declaration

@MainActor class UIWindow : UIView

Overview

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

window를 사용하는 경우

  • 메인 window를 제공하여 앱의 컨텐츠를 표시하는 경우
  • 필요에 따라 window를 추가적으로 만들어 컨텐츠를 표시하는 경우

일반적으로 Xcode는 앱의 메인 window를 제공합니다. 새로운 iOS프로젝트에서는 스토리보드를 사용하여 앱의 view를 정의합니다. 스토리보드에는 app delegate객체에 window속성이 있어야하며 Xcode템플릿은 이를 자동으로 제공합니다. 만약 스토리보드를 쓰지 않는다면 window를 꼭 직접 생성해야 합니다.
(스토리보드를 쓰지 않는 상황은 흔하죠. 마지막줄을 꼭 기억해야겠습니다.)

대부분의 앱에서는 기기의 메인 화면에 컨텐츠를 표시할 window가 하나만 필요합니다. 기기의 메인 화면에 추가로 window를 생성할 수 있지만 일반적으로 외부 화면(external screen)에 컨텐츠를 나타내는데 추가된 창(extra window)이 사용됩니다. 다음 링크 를 참고하세요.

다음과 같은 작업들에서 UIWindow객체를 사용합니다.

  • window의 z축 레벨을 설정하는것은 가시성에 영향을 줍니다.
  • window를 표시하고 키보드 이벤트의 대상으로 만듭니다.
  • 좌표 값을 window의 좌표계로 변환합니다.
  • window의 root view controller를 바꿉니다.
  • window가 표시되는 화면으로 변경합니다.

window는 자체적으로 시각적으로 표현할 외형이 없습니다. 대신 window에는 root view controller에 의해 관리되는 view가 하나 이상 호스팅됩니다. 스토리보드에서 root view controller를 설정하고 원하는 view들을 추가할 수 있습니다.

UIWindow의 subclass는 거의 필요하지 않습니다. window에 구현하려는 동작의 종류는 높은 레벨의 view controller에서 좀 더 쉽게 구현될 수 있습니다. window를 subclass하고 싶은 몇안되는 경우 중 하나는 window의 key값이 변경될 때 key() 혹은 resignKey()메소드를 재정하는 것이다. 특정 화면에 window를 표시하는 방법에 대한 정보를 얻고싶다면 UIScreen를 참조하세요.

Understanding Keyboard Interactions

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

어떤 window가 key window인지 알아야 한다면 didBecomeKeyNotificationdidResignKeyNotification notification을 관찰(observe)하세요. 시스템에서는 앱의 key window 변경에 대한 응답으로 알림을 보냅니다.

정리

  • window는 view들의 배경이다. (액자로 생각하면 쉽게 이해가 된다.)
  • 스토리보드를 쓴다면 Xcode에서 자동으로 window를 생성해주지만, 스토리보드를 안쓴다면 window를 직접 생성해야한다.
  • UIWindow는 그 자체로 보여주는 것은 없고 root view controller에 의해 관리되는 view가 보여진다.
  • window에 구현하려는 동작들은 subclass하지 않고 상위레벨의 view controller에서 구현하는 것이 더 편하다.
  • 대부분의 앱에서는 window가 하나만 필요하다.
  • window중에서 key window가 있는데 isKeywindow속성을 통해 그 여부를 알 수 있고 key window가 되거나 해제될 때 notification을 이용하여 알림 받을 수 있다.
profile
iOS & Swift

0개의 댓글