-
[iOS] μλμ°λ? (feat. UIWindow)iOS/π€ App 2021. 7. 5. 17:43
μλ νμΈμπΆ
μ΄λ² μκ°μλ μλμ°μ λν΄μ 곡λΆν΄λ³΄κ² μ΅λλ€.
μλμ°λ UIWindow μ€λΈμ νΈλ₯Ό κ°λ¦¬ν€λ λ§μΈλ°μ.
μλμ°λΌλ κ°λ μ΄ νμνκΈ° μμν λλ μλ§ μ€ν 리보λ μμ΄ UIλ₯Ό μ²μ μ½λλ‘ κ΅¬νν΄λ³Ό λ μΌ κ² κ°μμ.
μ΄ κΈμμλ μΈμ μ§μ μλμ°λ₯Ό μμ±ν΄μΌλλμ§μ λν΄μλ λ€λ£¨μμ΅λλ€.
λ κ°μ 곡μλ¬Έμλ₯Ό μ’ ν©ν΄μ μ 리νλ€λ³΄λ λ΄μ©μ΄ μ’ λ§μμ§ κ² κ°λ€μ.
μμ½ ν΄λ³΄μλ©΄
μλμ°λ λ·°λ€μ λ΄λ 컨ν μ΄λμ΄λ€.
μλμ°λ μ΄λ²€νΈλ₯Ό μ λ¬ν΄μ£Όλ 맀κ°μ²΄μ΄λ€.
iOS μ±μ μ½ν μΈ λ₯Ό νλ©΄μ 보μ¬μ£ΌκΈ° μν΄μ μ΅μ 1κ° μ΄μμ μλμ°λ₯Ό κ°μ§κ³ μλ€. (λ³΄ν΅ 1κ°)
μμ€ν μλμ°μμ μμ±λ μ΄λ²€νΈλ€μ Key Window λ‘ μ λ¬μ΄ λλ€.
μ΄ κΈμλ μλ κ²
External Display μ κ΄λ ¨λ λ΄μ©
κ·ΈλΌ μμν΄λ³Όκ²μ!!!π₯
μ μ
μ± UI μ λ°°κ²½λ§ μν μ νκ³ λ·°μ μ΄λ²€νΈλ₯Ό μ λ¬νλ μ€λΈμ νΈ
μ°μ μμμΌν μ μ UIWinodw λ UIView μ μλΈν΄λμ€λΌλ κ²μ λλ€.
κ·Έλ°λ° UIView λ UIResponder μ μλΈν΄λμ€μ΄μ£ ?
μ΄λ²€νΈλ₯Ό μ²λ¦¬νλ 리μ€ν°λ 체μΈ(Responder Chain) μλ UIWindow κ° νμ ν¬ν¨λ©λλ€.
μ΄λΆλΆμμ 'λ·°μ μ΄λ²€νΈλ₯Ό μ λ¬νλ' μ΄λΌλ μν μ΄ μνλλ κ²μ λλ€.
@MainActor λΌλ μ΄νΈλ¦¬λ·°νΈλ Swift 5.5 λΆν° λμ λλ κ°λ μΌλ‘, λ©μΈ μ°λ λμμ μ€νλλ ν΄λμ€μμ κ°λ¦¬ν΅λλ€.
μμ§ λ² ν ν μ€νΈ μ€μ΄κ³ μ£Όμ μ λ²μ΄λλ―λ‘, λ€μμ λ€λ£¨μ΄λ³΄λκ² μ’μ κ² κ°μ΅λλ€.
κ°μ
μ°μ κ·Έλ¦Όμ λν΄μ κ°λ¨ν 보μλ©΄, μμ μ μλλ‘ UIWindow λ λ·°λ€ κ°μ₯ λ€μμ λ°°κ²½λ§ μν μ νκ³ μμ΅λλ€.
" κ·Έ μμ Core Animation layers λ₯Ό 보면, λ μ΄μ΄λ λ·°μ 1 : 1 κ΄κ³λ‘ ννλμ΄ μλ μ€λΈμ νΈλ€μ λλ€.
iOSμμ λͺ¨λ λ·°λ€μ layer-backed λ·°λΌλ μ κ³Ό κ΄λ ¨μ΄ μλλ°μ.
κ΄λ ¨λ κΈμ CALayer μ λν΄μ μ 리ν μ΄ κΈμ μ°Έκ³ ν΄μ£ΌμΈμ! "
λͺ¨λ iOS μ±μ μ μ΄λ ν κ° μ΄μμ μλμ°λ₯Ό κ°μ§κ³ μμ΅λλ€.
μ¬κΈ°μ μλμ°λ UIWindow μ€λΈμ νΈλ₯Ό μλ―Έν©λλ€.
iOS μμ μλμ° μ체λ μμμ μΈ μμλ₯Ό μ ν ν¬ν¨νκ³ μμ§ μμ΅λλ€.
μλμ°λ κ·Έμ ν κ° μ΄μμ λ·°λ₯Ό ν¬ν¨ν μ μλ λΉμ΄μλ 컨ν μ΄λ μ λλ€.
( κ·Έλ¦¬κ³ μλ‘μ΄ μ½ν μΈ λ₯Ό 보μ¬μ£ΌκΈ° μν΄μ μλμ°λ₯Ό κ΅μ²΄νλ λμ , λ·°λ₯Ό κ΅μ²΄ν©λλ€ )
π’ μλμ°λ λ€μκ³Ό κ°μ μ± μμ κ°μ§κ³ μμ΅λλ€:
μ±μ΄ 보μ¬μ£Όλ μ½ν μΈ λ€μ ν¬ν¨νλ μν μ ν©λλ€.
λ·°λ₯Ό ν¬ν¨ν λ€λ₯Έ μ± λ΄ μ€λΈμ νΈλ€μκ² μ΄λ²€νΈλ₯Ό μ λ¬ν΄μ£Όλ ν΅μ¬μ μΈ μν μ ν©λλ€.
μ±μ λ·° 컨νΈλ‘€λ¬μ νλ©΄ λ°©ν₯μ ν ( landscape & portrait ) μ μ©μ΄νκ² νκΈ° μν΄ νμ ν©λλ€.
μλμ°λ λ·° 컨νΈλ‘€λ¬μ ν¨κ» λμνλ©΄μ μ΄λ²€νΈλ₯Ό νΈλ€λ§νκ³ μ±μ λμμ νμμ μΈ μμ λ€μ μνν©λλ€.
UIKit μ μ±μ λμ ꡬνμ΄ νμν λ
λ€λ₯Έ μ€λΈμ νΈλ€κ³Ό κ°μ΄ νλνλ©΄μ λλΆλΆμ μλμ° κ΄λ ¨ μνΈμμ© (window-related interactions) λ€μ μ²λ¦¬ν©λλ€.
π’ μ°λ¦¬λ λ€μ λ κ°μ§ κ²½μ°μ μλμ°λ₯Ό μ¬μ©ν©λλ€:
μ±μ μ½ν μΈ λ₯Ό νλ©΄μ 보μ¬μ£ΌκΈ° μνμ¬ Main window λ₯Ό μ 곡ν΄μΌν λ
μΆκ°μ μΈ μ½ν μΈ λ₯Ό 보μ¬μ£ΌκΈ° μν΄ μΆκ°μ μΈ window λ₯Ό μμ±ν΄μΌ ν λ (external display λ₯Ό μ¬μ©ν κ²½μ°)
μλμ°λ₯Ό μμ±νκ³ μ€μ νλ λ°©μμ μ½λλ‘ μμ±νκΈ° νΉμ μΈν°νμ΄μ€ λΉλλ₯Ό μ¬μ©νκΈ° λ κ°μ§κ° μμ΅λλ€.
μ€ν 리보λ λ°©μ(μΈν°νμ΄μ€ λΉλλ₯Ό μ΄μ©) μΌλ‘ iOS νλ‘μ νΈλ₯Ό ꡬμ±νλ€κ³ κ°μ ν΄λ³΄κ² μ΅λλ€.
μ΄ κ²½μ°, Xcode λ μ±μ λ©μΈ μλμ° λ₯Ό μλμΌλ‘ μ 곡ν©λλ€.
μ€ν 리보λλ AppDelegate μ€λΈμ νΈμ window μμ±μ΄ UIWindow μ€λΈμ νΈλ‘ μ΄κΈ°ν λμ΄μμ΄μΌ μ λλ‘ μλν©λλ€.
λ¨, SceneDelegate κ°λ μ΄ λ±μ₯ν μ΄νμλ SceneDelegate μ€λΈμ νΈκ° window μμ±μ κ°μ§κ³ μμ΅λλ€.
μμ κ°μ΄ SceneDelegate μμ window λ Optional<UIWindow> λ‘ μ μΈλμ΄ μμ§λ§,
window μμ±μ μ¬μ©ν μμ μλ μ λλ‘ μ΄κΈ°ν λμ΄μμμ 보μ₯ν©λλ€.
Xcode κ° μλμΌλ‘ μ΄κΈ°νμν€κΈ° λλ¬Έμ λλ€.
λ§μ½ μ€ν 리 보λλ₯Ό μ¬μ©νμ§ μκ³ μ½λλ‘ UI λ₯Ό ꡬμ±νλ€λ©΄, μλμ°λ₯Ό μ§μ μμ±ν΄μΌν©λλ€.
μ 리λ₯Ό νμλ©΄ μλμ° μμ±μ κ³ λ €ν΄μΌν 4κ°μ§ κ²½μ°κ° μκΉλλ€.ππ»ππ»ππ»
iOS 12 λ²μ μ΄ν νΉμ AppDelegate λ§ μ¬μ©ν κ²½μ°
a. Storyboard λ₯Ό μ¬μ©ν λ
μμμ μΈκΈνλλ‘ window μμ±μ΄ μ λλ‘ μ΄κΈ°ν λ©λλ€. λ°λ‘ μμ±ν΄μ€ νμκ° μμ΅λλ€.
b. UI λ₯Ό Programmatically νκ² κ΅¬μ±ν λ ( Storyboard λ₯Ό μ¬μ©νμ§ μμλ )
window κ° λ°λ‘ μ΄κΈ°νλμ§ μμ΅λλ€.
AppDelegate μ didFinishWithLaunchingOptions: μμ UIWindow() λ±μΌλ‘
μμ±ν΄μ μμ±μ μ΄κΈ°ν ν΄μ£Όμ΄μΌ ν©λλ€.
iOS 13 λ²μ μ΄μ SceneDelegate λ₯Ό μ¬μ©ν λ
(iOS 13 λ²μ μ΄μμμλ AppDelegate μ SceneDelegate λ₯Ό λͺ¨λ μ¬μ©νμ§λ§ window μ μ΄μ μ λ§μΆκ³ μκ°ν΄λ³΄μμ΅λλ€.)
a. Storyboard λ₯Ό μ¬μ©ν λ = μμ±ν νμ β
b. UI λ₯Ό Programmatically νκ² κ΅¬μ±ν λ ( Storyboard λ₯Ό μ¬μ©νμ§ μμλ )
SceneDelegate μ willConnectTo: λ©μλμμ μ§μ μμ± ( μ΄ λ§ν¬ μ°Έμ‘° )
// scene(willConnectTo:options:) λ©μλ λ΄λΆμμ // λ μμ± λ°©μμ μ°¨μ΄λ????? UIWindow(frame: UIScreen.main.bounds) UIWindow(frame: windowScene.coordinateSpace.bounds)
μ±μ΄ μ€νλ λλ μ΄λ€ μνλ‘ μ€νλλ κ²κ³Όλ μκ΄ μμ΄ λ©μΈ μλμ°λ νμ μμ±λμ΄μΌ ν©λλ€.
μλμ°λ₯Ό μμ±νκ³ μ€μ νλ μμ μ체λ κ³ λΉμ©μ μμ μ΄ μλλλ€.
νμ§λ§ background λ‘ μ€ν λ κ²½μ°, μλμ°λ₯Ό 'visible' νκ² νλ κ²μ νΌν΄μΌν©λλ€.
π’ μλμ°(UIWindow) μ€λΈμ νΈλ₯Ό ν΅ν΄ λ€μκ³Ό κ°μ μμ λ ν μ μμ΅λλ€:
μλμ°μ z μΆ μ’νλ₯Ό μ€μ νμ¬, λ€λ₯Έ μλμ°μ κ΄κ³μ λ°λΌ 보μ΄λ μ λλ₯Ό μ‘°μ ν μ μμ΅λλ€ (λ·° κ³μΈ΅κ³Ό μ μ¬)
μλμ°λ₯Ό 보μ¬μ£Όκ³ , ν€λ³΄λ μ΄λ²€νΈμ νκ²μΌλ‘ μ€μ ν μ μμ΅λλ€.
μλμ° μ’ν μμ€ν μ μ’νλ₯Ό λ³νν μ μμ΅λλ€.
μλμ°μ Root ViewController λ₯Ό λ³κ²½ν μ μμ΅λλ€.
μλμ°κ° νμλκ³ μλ (κΈ°κΈ°)μ€ν¬λ¦°μ λ³κ²½ν μ μμ΅λλ€.
μλμ°λ κ·Έκ² μμ²΄λ‘ μ΄λ ν μκ°μ μΈ ννλ¬Όμ κ°μ§κ³ μμ§ μμ΅λλ€.
(μμ κΈ λ΄μ©μμλ λμμ΅λλ€. μλμ°λ λ·°λ₯Ό ν¬ν¨ν μ μλ λΉμ΄μλ 컨ν μ΄λλ€!!!!!!!!!)
λμ μ μλμ°λ ν κ° μ΄μμ λ·°λ₯Ό μμ£Όμν€κ³ μλλ°,
μ΄ λ·°λ€μ μλμ°μ Root ViewController μ μν΄ κ΄λ¦¬λλ κ²λ€μ λλ€.
UIWindow λ₯Ό μλΈν΄λμ±ν μΌμ κ±°μ μμ΅λλ€.
μλμ°μμ ꡬννκ³ μΆμ΄ν λ²ν λμλ€μ λ μ-λ λ²¨μΈ λ·° 컨νΈλ‘€λ¬μμ λ³΄ν΅ λ μ½κ² ꡬνν μ μμ΅λλ€.
κ±°μ μΌμ΄λμ§ μμ μΌμ΄μ§λ§ μλΈν΄λμ±μ νλ€λ©΄, becomeKey() λ resignKey() λ₯Ό μ€λ²λΌμ΄λ©νμ¬ μλμ°μ ν€ μνκ° λ³κ²½λ λ 컀μ€ν ν λμμ ꡬννκ³ μΆμ κ²½μ°μΌ κ²μ λλ€.
μλμ°κ° νμλ μ€ν¬λ¦°μ ꡬ체μ μΌλ‘ μ νλ λ°©λ²μ λν΄μλ UIScreen λ¬Έμλ₯Ό νλ² μ΄ν΄λ³΄λκ²μ΄ μ’μ κ² κ°μ΅λλ€.
Understanding Keyboard Interactions
ν°μΉ μ΄λ²€νΈμ κ²½μ° μ΄λ²€νΈκ° λ°μν μλμ°μ μ§μ μ λ¬μ΄ λ©λλ€.
κ·Έλ°λ° κ΄λ ¨ μ’νκ°μ΄ μλ μ΄λ²€νΈ κ°μ κ²½μ°μλ ν€ μλμ° (Key Window) λ‘ μ λ¬ λ©λλ€.
κ·Έλ°λ° κ΄λ ¨ μ’νκ°μ΄ μλ μ΄λ²€νΈλ μ΄λ€ μ΄λ²€νΈμΌκΉμ?????
μμ€ν μ΄ μμ±ν μλμ°μμ μμ±λ μ΄λ²€νΈλ₯Ό κ°λ¦¬ν€λ κ² κ°μ΅λλ€.
μλ₯Ό λ€μ΄ κ°μ ν€λ³΄λ μ°½μ μμ€ν μ΄ μμ±ν μλμ°μ λλ€.
ν€λ³΄λ μ°½μμ κΈμλ₯Ό μ λ ₯ν λ λ°μνλ μ΄λ²€νΈλ€μ μ±μ ν€ μλμ°λ‘ μ λ¬μ΄ λ©λλ€.
μ¬κΈ°μ UIInputView λΌλ κ°λ μ΄ λ±μ₯νλλ°, 곡λΆν΄λ΄μΌν κ² κ°μ΅λλ€.
νλμ μμ μλ μ€μ§ ν κ°μ μλμ°λ§μ΄ ν€ μλμ°κ° λ μ μμ΅λλ€.
ν€ μλμ°λ isKeyWindow λΌλ μμ±μ ν΅ν΄ κ²°μ ν μ μμ΅λλ€.
μ±μμ External Display κ° μλ κ²½μ° μλμ°λ 1κ°μ΄κΈ° λλ¬Έμ
λλΆλΆμ κ²½μ°, μ±μ λ©μΈ μλμ°κ° ν€ μλμ°μ λλ€.
νμ§λ§ UIKit μ νμν κ²½μ° λ€λ₯Έ μλμ°λ₯Ό ν€ μλμ°λ‘ μ§μ νκΈ°λ ν©λλ€.
λ§μ½ μ΄λ€ μλμ°κ° ν€ μλμ°μΈμ§ μκ³ μΆλ€λ©΄,
didBecomeKeyNotification μ΄λ didResignKeyNotification λ Έν°λ₯Ό μ΅μ λΉν΄ 보μΈμ.
( νμΈ μ μλ ν€λ³΄λμ°½μ΄ λ¨λ©΄ μ± λ©μΈ μλμ°κ° KeyWindow κ° μλκ² λκ² κ΅¬λ λΌκ³ μκ°νλλ°,
κ·Έλλ‘ KeyWindow μμ΅λλ€.
κ·Έλμ ν€λ³΄λ μλμ°μμ λ°μν μ΄λ²€νΈλ KeyWindow μΈ λ©μΈ μλμ°λ‘ μ λ¬λ©λλ€!!)
μμ€ν μ΄ μ±μ ν€ μλμ°κ° λ³κ²½λ λ μμ λ Έν°λ₯Ό λΏλ €μ€λλ€
μ΄λ€ μλμ°λ₯Ό ν€ μλμ°λ‘ κ°μ νκ±°λ, ν€ μλμ°λ₯Ό ν΄μ μν€κ³ μΆλ€λ©΄ μ΄ ν΄λμ€μ μ μ ν λ©μλλ₯Ό μ°Ύμμ νΈμΆνμΈμ.
makeKey(), resignKey() λ₯Ό κ°λ¦¬ν€κ³ μμ΅λλ€.
Changing the Window Level
κ°κ°μ UIWindow μ€λΈμ νΈλ μ€μ κ°λ₯ν windowLevel μμ±μ΄ μμ΅λλ€. (μμ μ΄ κ°λ₯ν¨)
μ΄ μμ±κ°μ z μΆ μ’ν κ°μ λνλ΄λ κ²μ λλ€.
μ΄ μμ±μ ν΅ν΄ λ€λ₯Έ μλμ°μ λΉκ΅νμ¬ μμ μ μμΉλ₯Ό κ²°μ ν©λλ€.
μ΄ μμ±μ UIWindow.Level νμ μ΄λ©°, κ°μ λ 벨μ μλμ°λ λ€λ₯Έ λ 벨μ μλμ°λ³΄λ€ μ νΉμ λ€μͺ½μ λνλ©λλ€.
κ·Έλ°λ° κ°μ λ 벨 μμμμ μλμ° μμλ 보μ₯λμ§ μμ΅λλ€.
μλμ° λ 벨μ κΈ°λ³Έ κ°μ normal μ λλ€.
λλΆλΆμ κ²½μ°λ μ±μ μλμ°λ€μ λ 벨μ λ³κ²½ν νμκ° μμ΅λλ€.
μλ‘ μμ±λ μλμ°λ€μ μμ±κ³Ό λμμ normal λ λ²¨λ‘ μ€μ λ©λλ€.
normal μλμ°λ μ±κ³Ό κ΄λ ¨λ μ½ν μΈ λ₯Ό νμνλ μλμ°μμ κ°λ¦¬ν΅λλ€.
λ λμ λ 벨μ μλμ°λ μ± μ½ν μΈ μμ λ μΌλ§νλ μ 보λ₯Ό νμνκΈ°μν΄ λ¨κ²¨λ κ² μ λλ€.
μλ₯Ό λ€μ΄ μμ€ν μν λ° (system status bar) νΉμ κ²½κ³ μ°½ (alert messages) κ° μμ΅λλ€.
κ·Έλμ μ λ κ²½κ³ μ°½μ΄ λνλ¬μ λμ μλμ° λ λ²¨μ΄ .alert μΈμ§ μ λ§ νμΈν΄λ³΄κ³ μΆμλλ°μπ
UIApplication.shared.windows μμ±μμλ μμ€ν μ΄ λ§λ μλμ°λ₯Ό νμΈν μ μλ€λ κ²μ μκ² λμμ΅λλ€.
μ΄ν
μ κ²½κ³ μ°½μ΄λΌλ κ²μ΄ μ± λ΄μμ UIAlertController λ‘ μμ±ν κ²½κ³ μ°½κ³Όλ
무κ΄ν κ²μ΄λΌλ κ²μ λ·° λλ²κΉ μ ν΅ν΄ νμΈνμ΅λλ€.
λ!
π€π’[μ°μ§±μ iOS λΈλ‘κ·Έ]π΅π»
iOSλ₯Ό 곡λΆνλ©΄μ λ°°μ΄ λ΄μ©μ κΈ°λ‘νκ³ μμ΅λλ€.μ°Έκ³ μλ£ 2: https://developer.apple.com/documentation/uikit/uiwindow
'iOS > π€ App' μΉ΄ν κ³ λ¦¬μ λ€λ₯Έ κΈ
[iOS] Container View Controller λ? (0) 2021.07.26 [iOS] 리μ€ν°λ μ²΄μΈ (Responder Chain) μ΄λ? (feat. UIResponder, First Responder, UIEvent) (2) 2021.07.12 [iOS] Core Animation μ΄λ? (2) (0) 2021.07.05 [iOS] Core Animation μ΄λ? (1) (0) 2021.07.05 [iOS] CALayer λ? (0) 2021.07.05