UIWindow

Panther·2021년 10월 2일
0

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

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

앱의 UI에 대한 배경이며, 뷰에 이벤트를 전달하는 객체입니다.

Declaration

@MainActor class UIWindow : UIView

Overview

윈도우는 이벤트 처리 및 앱의 동작에 근본이 되는 다른 많은 작업 수행을 위해 뷰 컨트롤러와 함게 작동합니다. UIKit은 많은 앱 동작을 구현하는 것이 필요한 경우에 다른 객체와 함께 동작하면서 대부분의 윈도우 관련 상호작용을 처리합니다.

아래 작업이필요할 때에만 윈도우를 사용할 수 있습니다.

  • 앱 컨텐트 표시를 위해 메인 윈도우를 제공하는 것입니다.
  • 추가적인 컨텐트를 표시하기 위해 추가 윈도우를 생성(필요한 경우)하는 것입니다.

Xcode는 보통 앱의 메인 윈도우를 제공합니다. 새 iOS 프로젝트는 앱의 뷰를 정의하기 위해 스토리보드를 사용합니다. 스토리보드는 Xcode 템플릿이 자동으로 제공하는 앱 딜리게이트 객체에서 윈도우 속성의 존재를 요구합니다. 앱이 스토리보드를 사용하지 않는 경우 이와 같은 윈도우를 직접 생성해야 합니다.

대부분의 앱은 기기의 메인 스크린에서 앱의 컨텐트를 표시하는 하나의 윈도우만 필요합니다. 기기의 메인 스크린에서 추가적인 윈도우를 생성할 수 있을지라도 추가적인 윈도우는 Displaying Content on a Connected Screen에서 설명하는 것처럼 외부 스크린에서 컨텐트를 표시하기 위해 사용되기도 합니다.

또한, 몇 가지 다른 작업을 위해 UIWindow 객체를 사용할 수도 있습니다.

  • 다른 윈도우에 상대적인 윈도우의 시각화에 영향을 미치는 윈도우의 z축 수준을 설정합니다.
  • 윈도우를 보여주는 것과 윈도우를 키보드 이벤트의 타깃으로 만드는 것입니다.
  • 좌표값을 윈도우의 좌표 시스템으로 혹은 윈도우의 좌표 시스템으로부터 변환하는 것입니다.
  • 윈도우의 루트 뷰 컨트롤러를 변경하는 것입니다.
  • 윈도우가 표시되는 스크린을 변경하는 것입니다.

윈도우는 스스로 어떠한 시각적 모양을 갖지 않습니다. 대신 윈도우는 윈도우의 루트 뷰 컨트롤러에 의해 관리되는 하나 혹은 하나 이상의 뷰를 호스트합니다. 인터페이스에 적합한 어떠한 뷰를 추가하면서 스토리보드에 있는 루트 뷰 컨트롤러를 설정할 수 있습니다.

UIWindow 서브클래싱은 거의 필요가 없습니다. 보통 윈도우에서 구현할 동작의 종류들은 고수준 뷰 컨트롤러에서 더 쉽게 구현될 수 있습니다. 서브클래싱이 필요한 드문 경우는 윈도우의 키 상태가 변경될 때 커스텀 동작을 구현하기 위해 becomeKey() 혹은 resignKey() 메소드를 오버라이드 하는 경우입니다. 특정 스크린에서 윈도우를 표시하는 방법에 대한 정보는 UIScreen을 보시기 바랍니다.

UIScreen
https://developer.apple.com/documentation/uikit/uiscreen
https://velog.io/@panther222128/UIScreen

Understanding Keyboard Interactions

터치 이벤트는 발생 시 윈도우에 전달되는 반면에 관련 좌표값을 갖지 않는 이벤트는 키 윈도우에 전달됩니다. 한 번에 하나의 윈도우만 키 윈도우가 될 수 있으며, 윈도우의 상태를 결정하기 위해 윈도우의 isKeyWindow 속성을 사용할 수 있습니다. 대부분 앱의 메인 윈도우가 키 윈도우이지만, UIKit은 필요한 경우 다른 윈도우를 선언할 수 있습니다.

어떤 윈도우가 키인지 알아야 할 필요가 있다면 didBecomeKeyNotificationdidResignKeyNotification 노티피케이션을 관찰하시기 바랍니다. 시스템은 앱에서 키 윈도우 변경에 대한 응답으로 이와 같은 노티피케이션을 전달합니다. 윈도우를 키가 되도록 강제하려고 하거나 키 상태를 벗어나도록 강제하고자 한다면, 이 클래스의 적합한 메소드를 호출하시기 바랍니다.

0개의 댓글