๐ŸŽ iOS & Swift

[iOS] UIWindow

taeeekki 2021. 11. 7. 16:30

Swift · iOS UIWindow ๊ฐ์ฒด

 

๐Ÿ’ฅ ์ธ์‚ฌ๋ง

์•ˆ๋…•ํ•˜์„ธ์š”, ํƒœ๋ผ์ž…๋‹ˆ๋‹ค ใ€ฐ ๐Ÿ‘‹ ๋‹ค์Œ ์นดํ…Œ๊ณ ๋ฆฌ์—์„œ๋Š” ๋ชจ๋ฅด๋Š” ๊ฐœ๋…์ด๋‚˜ ํ‚ค์›Œ๋“œ, ๋ฌธ๋ฒ• ๋“ฑ ๋‹ค์–‘ํ•œ ๋‚ด์šฉ์„ ์ •๋ฆฌํ•ฉ๋‹ˆ๋‹ค. ๋‹ค์Œ ๋‚ด์šฉ์€ ์ €์˜ ์ธ์Šคํƒ€ ๊ฐœ๋ฐœ ๋กœ๊ทธ ๊ณ„์ •(@taekki.dev)์—๋„ ์˜ฌ๋ผ๊ฐ€๋‹ˆ ๋งŽ์€ ๊ด€์‹ฌ ๋ถ€ํƒ๋“œ๋ ค์š” :) ๊ฐœ๋…์˜ ๋นˆ๊ณต๊ฐ„์„ ๋ฉ”๊ฟ€ ์ˆ˜ ์žˆ๋Š” ๊ทธ๋‚ ๊นŒ์ง€ ํ™”์ดํŒ…ํ•ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿผ ์˜ค๋Š˜ ํฌ์ŠคํŒ… ์‹œ์ž‘ํ•ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ๐Ÿ™Œ

 

 


 

๐Ÿ’ฌ ๋“ค์–ด๊ฐ€๋ฉฐ

UIWindow๋ฅผ ์ฒ˜์Œ ๋งˆ์ฃผํ•˜๊ฑฐ๋‚˜, ๊ฐ€์žฅ ๋งŽ์ด ๋ณด๋Š” ๊ณณ์ด ์–ด์ฉŒ๋ฉด SceneDelegate.swift ๋‚˜ AppDelegate.swift ์ผ์ง€๋„ ๋ชจ๋ฆ…๋‹ˆ๋‹ค. ํ•ญ์ƒ ๊ฐ€๋ณ๊ฒŒ ์ง€๋‚˜์น˜๊ธฐ๋งŒ ํ–ˆ๋˜ UIWindow๊ฐ€ ๋ฌด์—‡์ธ์ง€ ์ด๋ฒˆ์— ์•Œ์•„๋ณด๊ธฐ๋กœ ํ–ˆ์Šต๋‹ˆ๋‹ค. ์ด๋ฒˆ ๊ธ€์€ Apple ๊ณต์‹๋ฌธ์„œ์˜ ๊ตฌ์กฐ๋ฅผ ๋ฐ”ํƒ•์œผ๋กœ ๊ตฌ์„ฑํ–ˆ์Šต๋‹ˆ๋‹ค.

 

 


 

๐ŸŒฑ UIWindow์˜ ํƒ€์ž…

๐Ÿ“Œ  ํƒ€์ž…(Type) - ํด๋ž˜์Šค

 

ํƒ€์ž…์€ ํด๋ž˜์Šค(Class)๋„ค์š” :-)

 


 

๐ŸŒฑ UIWindow์˜ ์ •์˜

๐Ÿ“Œ  ์ •์˜(Definition)
The backdrop for your app's user interface and the object that dispatches events to your views.

 

1. ์•ฑ UI์˜ ๋ฐฐ๊ฒฝ(backdrop)

2. ๋ทฐ์— ์ด๋ฒคํŠธ๋ฅผ ๋ณด๋‚ด๋Š”(dispatch) ๊ฐ์ฒด

 

UIWindow๋Š” ํ•œ ๋งˆ๋””๋กœ ๋ทฐ๋ฅผ ๋‹ด๋Š” ์ƒ์ž, ์ปจํ…Œ์ด๋„ˆ(๐Ÿ“ฆ)๋ผ๊ณ  ์ƒ๊ฐํ•˜๋ฉด ํŽธํ•  ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

 


๐ŸŒฑ UIWindow์˜ ์„ ์–ธ

๐Ÿ“Œ  ์„ ์–ธ(Declaration)
@MainActor class UIWindow: UIView

 

1. MainActor : ๋ฉ”์ธ ์Šค๋ ˆ๋“œ์—์„œ ๋™์ž‘์„ ๋ณด์žฅํ•˜๋Š” ์•กํ„ฐ

2. UIView๊ฐ€ UIWindow์˜ ๋ถ€๋ชจ โœจ

 

Actor์˜ ๊ฐœ๋…์€ ์กฐ๋งŒ๊ฐ„ ๋‹ค๋ฅธ ๊ธ€์— ์ ์–ด๋ณด๋ ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค. ์•„์ง Xcode๊ฐ€ ์—…๋ฐ์ดํŠธ๊ฐ€ ์•ˆ๋ผ์„œ ์ฝ”๋“œ๋ฅผ ํ…Œ์ŠคํŠธํ•ด๋ณด์ง€ ๋ชปํ•˜๊ณ  ์žˆ๋„ค์š”.. ์—ฌ๊ธฐ์„œ๋Š” ๊ฐ„๋‹จํ•˜๊ฒŒ MainActor๋ผ๋Š” ๊ฒƒ์ด ๋ฉ”์ธ ์Šค๋ ˆ๋“œ์—์„œ ๋™์ž‘์„ ๋ณด์žฅํ•  ์ˆ˜ ์žˆ๋„๋ก ๋„์™€์ฃผ๋Š” ์นœ๊ตฌ๋ผ๊ณ ๋งŒ ์ดํ•ดํ•˜๋ฉด ๋  ๊ฒƒ ๊ฐ™์•„์š”!

 

๊ทธ๋ฆฌ๊ณ  ๋˜ ํ•˜๋‚˜ ์ค‘์š”ํ•œ ๊ฒƒ์ด UIView๊ฐ€ UIWindow์˜ ์Šˆํผํด๋ž˜์Šค ๋ผ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์•Œ๊ณ  ๊ณ„์…จ๋‚˜์š”..? ์ •ํ™•ํ•˜๊ฒŒ ๊ธฐ์–ตํ•˜๊ณ  ๋„˜์–ด๊ฐ€๋„๋ก ํ•ฉ์‹œ๋‹ค~

 


๐ŸŒฑ UIWindow์˜ ํŠน์ง•

๊ทธ ์™ธ์˜ ํŠน์ง•์„ ์ •๋ฆฌํ•ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

Windows๋Š” ์ด๋ฒคํŠธ๋ฅผ ์ฒ˜๋ฆฌํ•˜๊ณ  ์•ฑ ์ž‘๋™์— ๊ธฐ๋ณธ์ ์ธ ๋งŽ์€ ๋‹ค๋ฅธ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๊ธฐ ์œ„ํ•ด ๋ทฐ ์ปจํŠธ๋กค๋Ÿฌ์™€ ํ•จ๊ป˜ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.

 

1. ์•ฑ์˜ ์ฝ˜ํ…์ธ ๋ฅผ ํ‘œ์‹œํ•  ๊ธฐ๋ณธ ์ฐฝ ์ œ๊ณต

2. ์ถ”๊ฐ€ ์ฝ˜ํ…์ธ ๋ฅผ ํ‘œ์‹œํ•˜๊ธฐ ์œ„ํ•ด ์ถ”๊ฐ€ ์ฐฝ ์ œ๊ณต (์„ ํƒ์ )

 

Xcode๋Š” ์ž๋™์œผ๋กœ ์•ฑ์˜ ๊ธฐ๋ณธ Window๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

 

1. ์ตœ์ดˆ์˜ ํ”„๋กœ์ ํŠธ์—๋Š” ์Šคํ† ๋ฆฌ๋ณด๋“œ๋ฅผ ์‚ฌ์šฉํ•ด์„œ ์•ฑ์˜ ๋ทฐ๋ฅผ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค.

2. ์Šคํ† ๋ฆฌ๋ณด๋“œ๋Š” Xcode์—์„œ ์ž๋™์œผ๋กœ ์ œ๊ณตํ•˜๋Š” AppDelegate(๋˜๋Š” SceneDelegate)์— window ํ”„๋กœํผํ‹ฐ๊ฐ€ ์กด์žฌํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

 

UIWindow๋Š” ๋ช‡ ๊ฐ€์ง€ ๋‹ค๋ฅธ ์ž‘์—…์„ ์œ„ํ•ด ๊ฐ์ฒด๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

 

1. Window์˜ z์ถ• ๋ ˆ๋ฒจ์„ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค. ๋‹ค๋ฅธ Window์™€ ๊ด€๋ จ๋œ Window์˜ ๊ฐ€์‹œ์„ฑ์— ์˜ํ–ฅ์„ ๋ฏธ์นฉ๋‹ˆ๋‹ค.

2. Window๋ฅผ ํ‘œ์‹œํ•˜๊ณ  ํ‚ค๋ณด๋“œ ์ด๋ฒคํŠธ์˜ ๋Œ€์ƒ์œผ๋กœ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.

3. ์ขŒํ‘œ๊ฐ’์„ Window ์ขŒํ‘œ๊ณ„๋กœ ๋ณ€ํ™˜ํ•˜๊ฑฐ๋‚˜ Window ์ขŒํ‘œ๊ณ„์—์„œ ๋ณ€ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

4. Window์˜ RootViewController๋ฅผ ๋ณ€๊ฒฝํ•ฉ๋‹ˆ๋‹ค.

5. Window๊ฐ€ ํ‘œ์‹œ๋˜๋Š” ์Šคํฌ๋ฆฐ์„ ๋ณ€๊ฒฝํ•ฉ๋‹ˆ๋‹ค.

 

UIWindow๋Š” ํ•˜์œ„ ํด๋ž˜์Šค๋ฅผ ๋งŒ๋“ค ํ•„์š”๊ฐ€ ๊ฑฐ์˜ ์—†์Šต๋‹ˆ๋‹ค.

 

1. Window์—์„œ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๋Š” ํ–‰๋™ ํƒ€์ž…์€ ์ผ๋ฐ˜์ ์œผ๋กœ ์ƒ์œ„ ๋ ˆ๋ฒจ์ธ ๋ทฐ ์ปจํŠธ๋กค๋Ÿฌ์—์„œ ๋ณด๋‹ค ์‰ฝ๊ฒŒ ๊ตฌํ˜„์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

2. becomeKey() ๋˜๋Š” resignKey() ๋ฉ”์„œ๋“œ๋ฅผ ์žฌ์ •์˜ํ•ด์„œ Window์˜ Key ์ƒํƒœ๊ฐ€ ๋ณ€๊ฒฝ๋  ๋•Œ ์‚ฌ์šฉ์ž ์ •์˜ ํ–‰๋™์„ ๊ตฌํ˜„ํ•  ๋•Œ ํ•˜์œ„ํด๋ž˜์Šค๋กœ ๋งŒ๋“œ๋Š” ๊ฒฝ์šฐ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

 


๐Ÿง‘๐Ÿป‍๐Ÿ’ป ๊ฐ„๋‹จํ•œ ์˜ˆ์ œ

Swift ์Šคํ† ๋ฆฌ๋ณด๋“œ ์—†์ด ํ™”๋ฉด ์‹œ์ž‘ํ•˜๊ธฐ (Scene Delegate์—์„œ ํ™”๋ฉด ์ดˆ๊ธฐํ™”ํ•˜๊ธฐ)

iOS 12๊นŒ์ง€๋Š” AppDelegate์—์„œ window๋ฅผ ์ƒ์„ฑํ•ด์คฌ๋Š”๋ฐ, iOS 13๋ถ€ํ„ฐ๋Š” SceneDelegate์—์„œ window๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค. (๋ฉ€ํ‹ฐ ์œˆ๋„์šฐ๋ฅผ ์ง€์›ํ•˜๊ธฐ ๋•Œ๋ฌธ์ด์ฃ !)

 

๐Ÿค– ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด์„œ ๊ฐ„๋‹จํ•˜๊ฒŒ ์•Œ์•„๋ณผ๊นŒ์š”?

 

(1) window๋ฅผ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.

- window ๊ฐ์ฒด๋Š” ์—ฌ๋Ÿฌ ๊ฐœ ๋งŒ๋“ค์–ด์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

- ๊ธฐ๋ณธ์ ์œผ๋กœ ๋งŒ๋“ค์–ด์ ธ์žˆ๋Š” window ๊ฐ์ฒด๋ฅผ ์‚ฌ์šฉํ•˜๋„๋ก ํ•ฉ๋‹ˆ๋‹ค.

 

(2) rootViewController ํ”„๋กœํผํ‹ฐ

- window์˜ root viewcontroller๋ฅผ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.

- window์˜ ์ตœ์ƒ๋‹จ ๋ทฐ ์ปจํŠธ๋กค๋Ÿฌ๋ฅผ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.

 

(3) makeKeyAndVisible() ๋ฉ”์„œ๋“œ

- key window๋กœ ์„ค์ •ํ•œ๋‹ค๋Š” ์˜๋ฏธ์ž…๋‹ˆ๋‹ค.

- window๊ฐ€ ์—ฌ๋Ÿฌ ๊ฐœ ์กด์žฌํ•  ๋•Œ, ๊ฐ€์žฅ ์•ž์ชฝ์— ๋ฐฐ์น˜๋œ window๋ฅผ key window๋ผ๊ณ  ๋ถ€๋ฆ…๋‹ˆ๋‹ค.

- window๋ฅผ ๋ณด์ด๊ฒŒ ํ•œ๋‹ค๋ผ๋Š” ์˜๋ฏธ๋„ ํฌํ•จํ•ฉ๋‹ˆ๋‹ค.

 


 

โœจ ๋งˆ๋ฌด๋ฆฌํ•˜๋ฉฐ

์• ํ”Œ ๊ณต์‹ ๋ฌธ์„œ๋ฅผ ์ฝ๋Š” ์ผ์ด ์ƒ๊ฐ๋ณด๋‹ค ์‰ฝ์ง€๋Š” ์•Š์ง€๋งŒ ํ•œ ๋ฒˆ ์ฝ๊ณ  ์ •๋ฆฌํ•˜๊ณ  ๋‚˜๋ฉด ๊ทธ๋™์•ˆ ๋ชจํ˜ธํ–ˆ๋˜ ๊ฐœ๋…์ด ์กฐ๊ธˆ์€ ์ •๋ฆฌ๋˜๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์ด๋ฒˆ์— UIWindow๊ฐ€ UIView์˜ ํ•˜์œ„ํด๋ž˜์Šค๋ผ๋Š” ์‚ฌ์‹ค์„ ์ฒ˜์Œ ์•Œ๊ฒŒ ๋˜์—ˆ๋Š”๋ฐ, ๊ทธ๋™์•ˆ 'Window๊ฐ€ ๋‹น์—ฐํžˆ ๊ฐ€์žฅ ๋†’์€ ๋…€์„ ์•„๋‹ˆ๊ฒ ์–ด'๋ผ๊ณ  ์ƒ๊ฐํ–ˆ๋˜ ๊ฒƒ์„ ๋ฐ”๋กœ ์žก๋Š” ์ข‹์€ ์‹œ๊ฐ„์ด์—ˆ๋„ค์š”..

 

๐Ÿคฅ์•„ ๊ทธ๋ฆฌ๊ณ  ์ด๊ฑด ์ €๋ฒˆ์—๋„ ์ƒ๊ฐํ–ˆ๋˜๊ฑด๋ฐ ์•„์ง ์‹คํ—˜์„ ํ•ด๋ณด์ง€๋Š” ๋ชปํ•œ ๋‚ด์šฉ์ธ๋ฐ์š”. ๊ฐœ๋ฐœํ•˜๋‹ค๊ฐ€๋ณด๋ฉด window์˜ rootViewController๋ฅผ ๊ต์ฒดํ•˜๋Š” ์ฝ”๋“œ๋ฅผ ์“ฐ๋Š” ๊ฒฝ์šฐ๊ฐ€ ์žˆ์ฃ . ๊ทธ ๊ฒฝ์šฐ์—๋Š” ๊ธฐ์กด์— ์Œ“์—ฌ์žˆ๋˜ ๋ทฐ๋“ค์€ ์–ด๋–ป๊ฒŒ ๋ ๊นŒ์š”? ๋ทฐ๊ฐ€ ์—†์–ด์ง€๋ฉด์„œ ๋ฉ”๋ชจ๋ฆฌ์—์„œ๋„ ํ•ด์ œ๊ฐ€ ๋ ์ง€ ๊ถ๊ธˆํ•˜๋„ค์š”.. (์•„,, ๋„ˆ๋ฌด ๋‹น์—ฐํ•œ๊ฑด๊ฐ€... ์–ด์จŒ๋“  ์˜ค๋Š˜ ํฌ์ŠคํŒ… ๋!)

 


 

๐Ÿ—‚ ๋ ˆํผ๋Ÿฐ์Šค

Apple ๊ณต์‹ ๋ฌธ์„œ

Zedd๋‹˜ ๋ธ”๋กœ๊ทธ

๊น€์ข…๊ถŒ๋‹˜ ๋ธ”๋กœ๊ทธ

Pingu๋‹˜ ๋ธ”๋กœ๊ทธ