내가 이해한 바로는 (하단 글 요약)
- 앱에는 UIWindow가 하나이상 존재
- 멀티 윈도우가 가능해지면서 하나 이상이라는 말이 나옴
- 그럼 어디에서 선언해주나? SceneDelegate!dm
- UIWindow의 프로퍼티는 window
- window들 중 keyWindow는 하나만 가능
- 대부분의 앱에서는 window가 하나만 필요
- window중에서 key window가 있는데 isKeywindow속성을 통해 그 여부를 알 수 있고 key window가 되거나 해제될 때 notification을 이용하여 알림 받을 수 있음
- UIView의 서브클래스가 UIWindow이다 잘못 알고 있지 말자
window란?
View의 가장 최상위 계층에 있는 것이 바로 window(UIView의 자식클래스). window는 UIwindow의 Instance다. window는 모든 View의 가장 위에 존재하는 superView라고 이해하면 된다.
RootView란?
rootView는 window의 속성 중 하나이다. 사용자가 실제로 볼 수 있는 화면은 rootView의 위에 생성한 UIView고 그 위의 View들이다.
iOS12까지는 App delegate에서 window를 생성해줬는데 13부터는 Scene delegate에서 window를 생성해준다. 왜냐하면 멀티윈도우가 지원되기 시작했기 떄문이다.
UIWindow
The backdrop for your app’s user interface and the object that dispatches events to your views.
앱의 사용자 인터페이스 배경과 이벤트를 뷰에 전송하는 객체
Window는 뷰 컨트롤러와 함께 이벤트를 처리하고 앱 작동에 필수적인 많은 작업을 수행한다.
Window를 사용하는 경우는 아래와 같다.
- 앱의 콘텐츠를 표시할 기본 Window를 제공
- 추가 콘텐츠를 표시할 때 필요한 경우 추가 window를 만든다.
일반적으로 Xcode는 앱의 기본 윈도우를 제공한다. 새로운 iOS 프로젝트는 스토리보드를 사용하여 앱의 뷰를 정의한다. 스토리보드는 Xcode 템플릿이 자동으로 제공하는 앱 위임 개체에 창 속성이 있어야 한다. SceneDelegate에서 window를 생성하여 제공하는 것이다.
앱이 스토리보드를 사용하지 않는다면, 이 창을 직접 만들어야 한다.
대부분의 앱은 장치의 메인 화면에 앱의 콘텐츠를 표시하는 하나의 윈도우만 필요하다. 장치의 메인 화면에 추가 윈도우을 만들 수 있지만, 일반적으로 외부 화면에 콘텐츠를 표시하는 데 사용됩니다.
UIWindow 객체를 사용하는 다른 작업
- 윈도우의 가시성에 영향을 주는 윈도우의 z축 수준을 설정
- 윈도우를 표시하고 키보드 이벤트의 대상으로 만듦
- 윈도우의 좌표계 간에 좌표 값을 창의 좌표계로 변환
- 윈도우의 루트뷰를 변경
- 윈도우에 표시되는 화면 변경
- 창의 루트 뷰 컨트롤러 변경
- 창이 표시되는 화면을 변경
윈도우는 시각적 외관이 없다. 대신, 루트 뷰 컨트롤러에 의해 관리되는 하나 이상의 뷰를 호스팅. 즉 보여주는 역할을 한다. 스토리보드에서 루트 뷰 컨트롤러를 구성하여 인터페이스에 적합한 뷰를 추가한다.
UIWindow를 서브클래스할 필요가 거의 없어야 한다. 윈도우에서 구현할 수 있는 행동의 종류는 일반적으로 더 높은 수준의 뷰 컨트롤러에서 더 쉽게 구현될 수 있다. 서브클래스를 원하는 몇 번 중 하나는 윈도우의 키 상태가 변경될 때 사용자 지정 동작을 구현하기 위해 becomeKey() 또는 resignKey() 메서드를 재정의하는 것이다
Understanding Keyboard Interactions
터치 이벤트는 발생한 윈도우으로 전달되는 반면, 관련 좌표 값이 없는 이벤트는 key window로 전달된다. 한 번에 하나의 윈도우만 keyWindow가 될 수 있으며, 창의 isKeyWindow 속성을 사용하여 상태를 결정할 수 있다. 대부분의 경우, 앱의 메인 창은 키 창이지만, UIKit은 필요에 따라 다른 창을 지정할 수 있다.
어떤 window가 key window인지 알아야 한다면 didBecomeKeyNotification 과 didResignKeyNotification notification을 관찰(observe)하자. 시스템에서는 앱의 key window 변경에 대한 응답으로 노티를 보낸다.
Understanding 하자면서 어렵따...
keyWindsow?
keyWindow란 UIWindow들 중에서 가장 먼저 터치 이벤트와 같은 메시지를 처리할 window를 의미하고, 가장 앞쪽에 배치된 window를 keywindow라고 한다..(키 윈도우가 필요한 이유는 만약 하나의 앱이 두개의 윈도우를 가진다고 했을 때 앱을 실행할 때 어떤 윈도우가 나와야할 지 헷갈려서 아닐까)
여러개의 window가 존재할 때는 하나만 keyWindow가 될 수 있다. 즉 만약 UIWindow가 여러개 있고 그 중 하나가 UIWindow의 메소드인 makeKeyAndVisible()을 통해 KeyWindow로 설장히면 기존의 KeyWindows는 해제되며 다른 윈도우로 옮겨간다.
아래처럼 sceneDelegage에서 설정하면 사뮬레이터 화면이 설정한 .cyan 컬러로 나온다. 내가 UIView에 아무것도 올리지 않았기 때문에 그냥 파란색화면이다.
func scene(\_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) {
guard let scene = (scene as? UIWindowScene) else { return }
window = **UIWindow**(**frame**: scene.coordinateSpace.bounds)
window?.windowScene = scene
let subView = UIView(frame: scene.coordinateSpace.bounds)
subView.backgroundColor = .cyan
window?.addSubview((subView))
print("윈도우를 키윈도우로 만들기 전 \\(window?.isKeyWindow)") // false
window?.makeKeyAndVisible()
print("윈도우를 키윈도우로 만들기 전 \\(window?.isKeyWindow)") // true
}
서브뷰로 구현했는데 루트뷰를 올리고 그 위에 내가 만들어 놓은 UIView를 어떻게 구현하는지는 모르겟다...
참고문서
🦓 말
사실 쓰면서도 이해가 안되는 것들이 너무 많았다
윈도우..? 스플릿뷰를 하면 윈도우가 2개가 되는 건가 뭐지...
근데 그 윈도우와 엑스코드의 윈도우는 다른 말인 것 같다.
내가 직접 앱을 구현하면서 좀더 부딪혀야 깨달을 수 있을 것 같은 느낌이다.
위의 레퍼만 본것이 아니라 레퍼 안의 레퍼 드으드응...다 보려니까 이건 뭐 바다속에 빠져 허우적
확실하게 접해본건 뷰의 계층이랄까...
그리고 그 계층이 어떻게 상호작용하는지 조금이나마 이해할 것 같다
오늘 과제해야하는데 이것만 해서 새벽까지 달려야한다 이럴수가
위의 글에서 단어를 영어로 썼다가 한글로 썼다가 난리인데 어쩔 수 없다
나는 생각과 개념의 기록이지 과제제출이 아니니까.....밥을 먹으러 가야겟다 ..!
'🌱' 카테고리의 다른 글
[iOS] Storyboard Reference (0) | 2022.07.13 |
---|---|
@available, #available, unavailable (0) | 2022.07.10 |
앱의 생명주기/ Scene (0) | 2022.07.07 |
Image View를 랜덤하게 바꾸기 (0) | 2022.07.05 |
Swift UIImageView을 Circle로 만들기 (0) | 2022.07.05 |