관리 메뉴

김종권의 iOS 앱 개발 알아가기

[iOS - swift] UIWindow, keyWindow, UITextEffectsWindow, UIKeyboardWindowScene, UIRemoteKeyboardWindow 개념 본문

iOS 응용 (swift)

[iOS - swift] UIWindow, keyWindow, UITextEffectsWindow, UIKeyboardWindowScene, UIRemoteKeyboardWindow 개념

jake-kim 2022. 6. 19. 22:33

UIWindow 개념

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

  • UIView의 서브클래싱이고, 앱의 뷰들을 표출할 컨테이너 역할과 이벤트를 수신하는 역할을 담당
    • 키보드 이벤트의 대상으로 지정하는데 UIWindow를 통해 이벤트를 받고 처리
    • UIWindow 하위에 속한 뷰들의 화면 변경
    • UIWindow는 고유한 시각적 모양은 없지만, UIWindow의 RootViewController에서 하나 이상의 view를 가지고 있는 형태
    • UIWindow가 여러개 존재할때는, keyWindow만이 터치 이벤트를 수신할 수 있음
// UIWindow는 UIView의 서브클래싱
@MainActor class UIWindow : UIView

 

keyWindow

  • keyWindow란 UIWindow들 중에서 가장 먼저 터치 이벤트와 같은 메시지를 처리할 window를 의미
  • 여러개의 window가 존재할때는 하나만의 keyWindow만 존재

https://developer.apple.com/documentation/uikit/uiapplication/1622924-keywindow

  • Xcode에서 Debug View Hieaarchy를 보면, UIWindow를 확인 가능
    • UIWindowScene
    • UIWindow
    • UITransitionView
    • UIDropShadowView

Debug View Hierarchy

  • UIWnidow는 key Window On 상태 (=keyWindow)
    • 만약 UIWindow가 여러개 있고, 그 중 하나가 UIWindow의 메소드인 makeKeyAndVisible()를 통해서 keyWindow로 설정하면 기존의 keyWindow는 해제되며 keyWindow가 자동으로 변경 (keyWindow는 하나만 가능)

런타임에 생기는 UIWindow

  • UITextField에서 키보드가 올라온 경우 생성되는 케이스
  • 기존 UIWindow와 동일한 레벨로 UITextEffectsWindow 생성

UITextEffectsWindow

  • 기존 UIWindowScene과 동일한 레벨로 UIKeyboardWindowScene, UIRemoteKeyboardWindow 생성
    • Uiremotekeyboardwindow는 애플에서 제공하는 시스템 키보드
    • 키보드 아래부분의 터치 영역을 막아야 하므로, 애플에서는 UIWindow로 띄워줌으로서 해결

UIRemoteKeyboardWindow

  • 내부 ViewController에서는 대표적으로 UIInputWindowController와 UISystemKeybaordDockController가 존재

cf) UITextEffectsWindow이 내부적으로 가지고 있는 UI들은 UIRemoteKeybaordWindow하위에 가지고 있어서 상식상으로는 UITextEffectsWindow는 필요 없어보이지만 생겨나는걸로 봐서는 시스템 내부적으로 어떤 처리를 위해 존재하는 듯 합니다.

혹시 UITextEffectsWindow의 역할에 대해서 아신다면 댓글로 남겨주세요:)

 

* 참고

https://developer.apple.com/documentation/uikit/uiapplication/1622924-keywindow

Comments