๐ŸŒฑ SeSAC

[SeSAC] 220706 TIL

taeeekki 2022. 7. 6. 18:49

๐Ÿชด Summary

  1. ์•ฑ์˜ ์ƒ๋ช… ์ฃผ๊ธฐ (App Life Cycle)
  2. App Delegate์™€ Scene Delegate
  3. iOS13, iOS14 ํŠน์ง•
  4. available attribute keyword (์ฝ”๋“œ์˜ ๋ฒ„์ „ ๋Œ€์‘์„ ์–ด๋–ป๊ฒŒ ํ•ด์•ผ ํ• ๊นŒ?)
  5. Not Running์ธ์ง€ Background์ธ์ง€ ๊ทธ ์ƒํƒœ๊ฐ€ ๊ถ๊ธˆํ•˜๋‹ค.
  6. ๋‹คํฌ๋ชจ๋“œ์™€ ์ปฌ๋Ÿฌ ์ง€์ •
  7. ๊ฐ€๋กœ๋ชจ๋“œ
  8. Project, Target
  9. UIWindow
  10. sleep() ๋ฉ”์„œ๋“œ๋ฅผ ์ด์šฉํ•ด Launch Screen ๋™์ž‘ ์‹œ๊ฐ„ ์กฐ์ •
  11. IBOutlet์ด ์ •์ƒ์ ์œผ๋กœ ์—ฐ๊ฒฐ์ด ์ž˜ ๋˜์ง€ ์•Š์„๋•Œ
  12. UITextField, UIButton
  13. IBOutlet๊ณผ IBAction
  14. ํ‚ค๋ณด๋“œ ๋‚ด๋ฆฌ๊ธฐ์™€ Tap Gesture

๐Ÿ—‚ Detail

TIL์— ๋„ˆ๋ฌด ๋งŽ์€ ๋ฆฌ์†Œ์Šค๋ฅผ ๋“ค์ด์ง€ ๋ง™์‹œ๋‹ค.

์•ฑ์˜ ์ƒ๋ช…์ฃผ๊ธฐ (Life Cycle)

๋‹ค์Œ ํŒŒ์ผ๊ณผ ๊ด€๋ จ์ด ์žˆ๋‹ค.

  • AppDelegate.swift
  • SceneDelegate.swift

์•ฑ์˜ 5๊ฐ€์ง€ ์ƒํƒœ

์•ฑ์˜ ์ƒ๋ช…์ฃผ๊ธฐ๋Š” 5๊ฐ€์ง€๋กœ ๋‚˜๋‰˜๊ธฐ ์ด์ „์— ์‹คํ–‰/์ข…๋ฃŒ ๊ทธ๋ฆฌ๊ณ  Foreground/Background ์ƒํƒœ๋กœ ๋‚˜๋‰œ๋‹ค.

์•ฑ์„ ์‚ฌ์šฉํ•˜๋‹ค๋ณด๋ฉด ์ „ํ™”๊ฐ€ ์˜ค๊ฑฐ๋‚˜, ์•Œ๋ฆผ์ด ์šธ๋ฆฌ๊ฑฐ๋‚˜ ๋˜๋Š” ๋‹ค๋ฅธ ์•ฑ์œผ๋กœ ์ „ํ™˜ํ•  ๋•Œ ๋™์ž‘์ด ๋‹ฌ๋ผ์ง€๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค. ์•„์ดํฐ์˜ ํ™”๋ฉด์€ ํ•˜๋‚˜์ด๊ธฐ ๋•Œ๋ฌธ์— ์ด ํ•œ ํ™”๋ฉด์„ ์ฐจ์ง€ํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ์•ฑ ๋งˆ๋‹ค ์šฐ์„ ์ˆœ์œ„๋ฅผ ๊ฐ€์ง€๋Š” ๊ฒƒ๋„ ํ•„์š”ํ•˜๊ณ , ์•ฑ ๋‚ด์—์„œ๋„ ํ˜„์žฌ ์–ด๋–ค ํ™”๋ฉด์ด ๋ณด์—ฌ์ ธ์•ผ ํ•  ์ง€๋„ ์ค‘์š”ํ•œ ๋ถ€๋ถ„์ด ๋œ๋‹ค. ์ด๋ฅผ ๊ด€๋ฆฌํ•˜๋Š” ๋ฐ ์ค‘์š”ํ•œ ๋ถ€๋ถ„์ด ์•ฑ์˜ ์ƒํƒœ, ์ฆ‰ ์ƒ๋ช… ์ฃผ๊ธฐ์ด๋‹ค. ์•ฑ์˜ ์ƒํƒœ๋Š” ํฌ๊ฒŒ ๋‚˜๋ˆ„๋ฉด ์•ฑ์„ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์„ ๋•Œ(ํ™”๋ฉด์— ์•ฑ์„ ๋„์šด ์ƒํƒœ), ์•ฑ์„ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์ง€ ์•Š์„ ๋•Œ๋กœ ๋‚˜๋ˆŒ ์ˆ˜ ์žˆ๋‹ค. ์ข€ ๋” ๋””ํ…Œ์ผํ•˜๊ฒŒ ๋‚˜๋ˆ„๋ฉด 5๊ฐ€์ง€ ์ƒํƒœ๋กœ ๋‚˜๋ˆŒ ์ˆ˜ ์žˆ๋‹ค.

์ž์„ธํ•œ ๋‚ด์šฉ์€ ๋‹ค๋ฅธ ๊ธ€์—์„œ ์‚ดํŽด๋ณด๊ณ ์ž ํ•œ๋‹ค.

  1. Not Running
    ์•ฑ์ด ์‹คํ–‰๋˜์ง€ ์•Š๊ฑฐ๋‚˜, ์ข…๋ฃŒ๋œ ์ƒํƒœ๋ฅผ ์˜๋ฏธํ•œ๋‹ค.
  2. Active
    Active ์ƒํƒœ์ธ ์•ฑ์€ ํ•˜๋‚˜์ด๋‹ค.
  3. Inactive
    ์ „ํ™”๊ฐ€ ์˜ค๊ฑฐ๋‚˜ ๋˜๋Š” ์•Œ๋žŒ์ด ์šธ๋ฆฌ๊ฒŒ ๋˜๋ฉด ์šฐ๋ฆฌ๊ฐ€ ์ปจํŠธ๋กค ํ•  ์ˆ˜ ์—†๋Š” ์ƒํƒœ๊ฐ€ ๋œ๋‹ค. ๋‹ค์‹œ ์•ฑ์„ ์‚ฌ์šฉํ•˜๊ฒŒ ๋˜๋Š” ์ˆœ๊ฐ„ Active๋กœ ๋Œ์•„์˜ค๊ฒŒ ๋œ๋‹ค.

Active์™€ Inactive ์ƒํƒœ๋ฅผ ๋ฌถ์–ด์„œ Foreground๋ผ๊ณ  ๋ถ€๋ฅธ๋‹ค.

  1. Background
    ์•ฑ์ด ํ™”๋ฉด์— ๋ณด์ด์ง€ ์•Š์ง€๋งŒ ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•˜๊ณ  ์žˆ๋Š” ์ƒํƒœ๋ฅผ ๋งํ•œ๋‹ค.
  2. Suspend
    ์ˆ˜๋™์œผ๋กœ ์•ฑ์„ ์ง€์šฐ๊ฒŒ ๋˜๋ฉด Suspend ์ƒํƒœ๊ฐ€ ๋œ๋‹ค. ์‹œ์Šคํ…œ์ด ์ผ์ • ์‹œ๊ฐ„์ด ์ง€๋‚˜๋ฉด ์•ฑ์„ ์™„์ „ํžˆ ์ข…๋ฃŒํ•˜๊ฒŒ ๋˜๋Š”๋ฐ ์ด ๋•Œ ์•ฑ์€ Not Running ์ƒํƒœ๋กœ ์ ‘์–ด๋“œ๊ฒŒ ๋œ๋‹ค.

App Delegate์™€ Scene Delegate

AppDelegate

  • ์•ฑ์„ ์‹คํ–‰ํ•˜๊ณ  ์ข…๋ฃŒํ•˜๋Š” ๊ฒƒ๋งŒ ๋‹ด๋‹น (iOS 13.0 ~)

๊ฐ ๋ฉ”์„œ๋“œ(- ๋ผ์ดํ”„ ์‚ฌ์ดํด)์—์„œ ์–ด๋–ค ํ–‰์œ„๋ฅผ ํ•  ์ˆ˜ ์žˆ์„์ง€ ๊นŠ๊ฒŒ ๊ณ ๋ฏผํ•ด ๋ณธ ์  ์—†์—ˆ๋Š”๋ฐ ์˜ค๋Š˜ ์ƒˆ์‹น ๊ฐ•์˜์—์„œ ์˜ˆ์‹œ๋กœ ๋“ค๋ ค์ฃผ์‹  ๋‚ด์šฉ์ด ํฅ๋ฏธ๋กœ์›Œ์„œ ๊ฐ€์ ธ์™€๋ณด์•˜๋‹ค.

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
  // - ์‚ฌ์šฉ์ž ์ •๋ณด ์ฒดํฌ
  // - ๋ฐ์ดํ„ฐ ์ฒดํฌ
  // - ์—…๋ฐ์ดํŠธ ์ตœ์‹ ํ™” ํ™•์ธ

  // ์œ„ํ—˜ํ•  ์ˆ˜ ์žˆ๋‹ค. (์ด ์‹œ๊ฐ„ ๋™์•ˆ ์–ด๋–ค ๋กœ์ง๋„ ์ˆ˜ํ–‰๋˜์ง€ ์•Š๋Š”๋‹ค. ๊ทธ๋ ‡๊ธฐ์— ๋กœ์ง์ด ๋ณต์žกํ•˜๋ฉด ์ง€์–‘ํ•˜๋Š” ๊ฒƒ์ด ์ข‹๋‹ค.)
  sleep(2)

  return true
}

func applicationDidEnterBackground(_ application: UIApplication) {
  // - ์•ฑ์ด ๋ฐฑ๊ทธ๋ผ์šด๋“œ ์ƒํƒœ๋กœ ๋“ค์–ด๊ฐˆ ๋•Œ
  // - Melon, Youtube : ๋งŒ์•ฝ์— ์‚ฌ์šฉ์ž๊ฐ€ ํ”„๋ฆฌ๋ฏธ์—„ ๊ฒฐ์ œ์ž์ด๋ฉด ๋ฐฑ๊ทธ๋ผ์šด๋“œ์—์„œ ๋Œ์•„๊ฐ€๋„๋ก(play) ํ•˜๊ณ ,
    // - ๊ทธ๊ฒŒ ์•„๋‹ˆ๋ผ๋ฉด ์ค‘๋‹จ(stop)์‹œํ‚ค๋ผ๊ณ  ๋ถ„๊ธฐ ์ฒ˜๋ฆฌ ๊ฐ€๋Šฅ
}

// โ—๏ธ ์˜ˆ์‹œ๊ฐ€ ๋„ˆ๋ฌด ํฅ๋ฏธ๋กญ๋‹ค.
func applicationWillEnterForeground(_ application: UIApplication) {
  // - ํ”„๋ฆฌ๋ฏธ์—„ ๊ฒฐ์ œ์ž๊ฐ€ ์•„๋‹Œ ์œ ์ €์—๊ฒŒ ๊ฒฐ์ œ ์œ ๋„ ํŒ์—…์„ ๋„์šธ ๋•Œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. (Background -> Active)
  // - ์นด์นด์˜คํ†ก ์‚ฌ์šฉ ์‹œ : ๋ฐฑ๊ทธ๋ผ์šด๋“œ์—์„œ ์•ฑ ์‚ฌ์šฉ ์ƒํƒœ๋กœ ๋‹ค์‹œ ๋Œ์•„์˜ฌ ๋•Œ ์ž ๊ธˆ ํ™”๋ฉด์„ ๋„์šฐ๋Š” ์ƒํ™ฉ
  // - ๊ธˆ์œต ์•ฑ ์‚ฌ์šฉ ์‹œ : ๋ฐฑ๊ทธ๋ผ์šด๋“œ์— ์žˆ์„ ๋•Œ, ํ™”๋ฉด์ด ์•ˆ ๋ณด์ด๋„๋ก ์ฒ˜๋ฆฌ (ํ™”๋ฉด ํ•˜๋‚˜๋ฅผ ์œ„์ชฝ์— ์”Œ์šฐ๋Š” ์‹์œผ๋กœ ์ฒ˜๋ฆฌ, ๊ทธ๋ฆฌ๊ณ  ์‹ค์ œ ์•ฑ์ด ์‹คํ–‰๋˜๋ฉด ํ™”๋ฉด์„ ๊ฑท์–ด๋‚ด๋Š” ์‹์œผ๋กœ ๊ด€๋ฆฌ ๊ฐ€๋Šฅ)
}

SceneDelegate

  • ์•ฑ์„ ํ•˜๋‚˜๋งŒ ์‹คํ–‰ํ•œ๋‹ค๊ณ  ํ•˜๋”๋ผ๋„ Scene ๋‹จ์œ„๋กœ ๋™์ž‘ํ•œ๋‹ค. (iOS 13.0 ~)
  • ํ™”๋ฉด์˜ ์ƒํƒœ ์ „ํ™˜, ๋ผ์ดํ”„ ์‚ฌ์ดํด์„ ๋‹ด๋‹นํ•œ๋‹ค. ๊ธฐ์กด AppDelegate๊ฐ€ ๋‹ด๋‹นํ•˜๋˜ ์ผ์ด ๋„˜์–ด์™”๋‹ค.
  • SceneDelegate๋ฅผ ์•„์˜ˆ ์“ฐ์ง€ ์•Š์„ ์ˆ˜๋„ ์žˆ๋‹ค. ์‚ญ์ œ๊ฐ€ ๊ฐ€๋Šฅํ•˜๋‹ค. ํ•˜์ง€๋งŒ ์š”์ฆ˜์—๋Š” ๊ทธ๋ ‡๊ฒŒ ์ž˜ ํ•˜์ง€ ์•Š๋Š” ์ถ”์„ธ์ด๋‹ค.

iOS13

Scene ๊ฐœ๋…์˜ ๋“ฑ์žฅ

iPad OS์— ๋„์ž…๋œ ์ƒˆ๋กœ์šด ๋‹ค์ค‘ ์ฐฝ ์ง€์›๊ธฐ๋Šฅ์ด ์ ์šฉ๋œ ๊ฒฐ๊ณผ๋‹ค. ๊ทธ ๊ฒฐ๊ณผ AppDelegate์˜ ์ž‘์—…์„ ๋‘๊ฐœ๋กœ ๋ถ„ํ• ํ•œ๋‹ค. AppDelegate๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ life Cycle ๋ฐ ์„ค์ •์„ ๋‹ด๋‹นํ•˜๊ณ , SceneDelegate๋Š” ํ™”๋ฉด (Scenes)์— ํ‘œ์‹œ๋˜๋Š” ๋‚ด์šฉ์„ ์ฒ˜๋ฆฌํ•˜๊ณ  ์•ฑ์ด ํ‘œ์‹œ๋˜๋Š” ๋ฐฉ์‹์„ ๊ด€๋ฆฌํ•œ๋‹ค.

์•„๋ž˜๋Š” ๊ฒฐ๊ตญ ๋‹ค ๊ฐ™์€ ๋ง์ด๋‹ค..ใ…Žใ…Ž Scene์ด ๋“ฑ์žฅํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— ๊ฐ€๋Šฅํ•ด์ง„ ์ผ์ด๋‹ค.

  • ๋‹ค๋ฅธ ์•ฑ ํ™”๋ฉด์„ 2๊ฐœ ์ด์ƒ ๋„์šฐ๋Š” ๊ฒƒ์ด ๊ฐ€๋Šฅํ•ด์กŒ๋‹ค. (iPad OS์˜ ๋“ฑ์žฅ)
  • ๋™์ผํ•œ ์•ฑ์„ 2๊ฐœ ์ด์ƒ ๋„์šฐ๋Š” ๊ฒƒ๋„ ๊ฐ€๋Šฅํ•ด์กŒ๋‹ค.
  • Active ์ƒํƒœ์˜ ์•ฑ์ด 2๊ฐœ ์ด์ƒ์ด ๋  ์ˆ˜ ์žˆ๋‹ค.

๋™์ผํ•œ ์•ฑ์„ 3๊ฐœ ์ด์ƒ ๋„์› ๋‹ค๊ณ  ๊ฐ€์ •ํ•ด๋ณด์ž. ํ•˜๋‚˜๋Š” Background, ํ•˜๋‚˜๋Š” Foreground, ํ•˜๋‚˜๋Š” Suspend ์ƒํƒœ๊ฐ€ ๋  ์ˆ˜ ์žˆ๋‹ค. ๊ทธ๋Ÿผ ์ด๋ฅผ ์–ด๋–ป๊ฒŒ ์ฒ˜๋ฆฌ๋ฅผ ํ•  ์ˆ˜ ์žˆ์„๊นŒ. ์—ฌ๊ธฐ์„œ Scene(Session)์˜ ๊ฐœ๋…์ด ๋“ฑ์žฅํ•˜๊ฒŒ ๋œ๋‹ค. iPad์—์„œ ์•ฑ์„ ๋„์šฐ๋Š” ๊ฒƒ์€ Scene์„ ๋„์šด๋‹ค์˜ ๊ฐœ๋…์ด ๋œ๋‹ค.

App Delegate ์‹คํ–‰ ์ดํ›„์— Scene Delegate์—๊ฒŒ ๊ถŒํ•œ์„ ์œ„์ž„ํ•œ๋‹ค. ๊ทธ๋ ‡๊ธฐ ๋•Œ๋ฌธ์— ํŒŒ์ผ์ด 2๊ฐœ๋กœ ๋‚˜๋‰œ๋‹ค. ์„œ๋กœ ์—ญํ• ์„ ๋ถ„๋ฆฌํ•˜๊ฒŒ ๋œ ๊ฒƒ์ด๋‹ค. ์•„ํ•˜ ๊ทธ๋ ‡๊ธฐ ๋•Œ๋ฌธ์— 12.4๋กœ os๋ฅผ ์‹คํ–‰ํ•˜๋ฉด ๊ธฐ์กด์—๋Š” SceneDelegate ํŒŒ์ผ์ด ์—†๊ธฐ ๋•Œ๋ฌธ์— ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•˜๊ฒŒ ๋œ๋‹ค.

๊ทธ๋ ‡๋‹ค๋ฉด ๋ฒ„์ „๋งˆ๋‹ค ๋ฒˆ๊ฑฐ๋กญ๊ฒŒ ๋ถ„๊ธฐ์ฒ˜๋ฆฌ๊ฐ€ ๋“ค์–ด๊ฐ€์•ผ ํ•˜๋‹ˆ๊นŒ iOS12๊นŒ์ง€ ๋ฐ˜๋“œ์‹œ ๋Œ€์‘์„ ์‹œ์ผœ์•ผ ํ• ๊นŒ์— ๋Œ€ํ•œ ๋ฌผ์Œ์ด ์ƒ๊ธด๋‹ค. ์ด์ œ ์‚ฌ์šฉ์ž์˜ ๊ธฐ๊ธฐ ๋ฒ„์ „ ์—…๋ฐ์ดํŠธ๋„ ์–ด๋А ์ •๋„ ๋˜์—ˆ๊ธด ํ•˜์ง€๋งŒ ์•„์ง๊นŒ์ง€๋Š” ์–ด๋А ์ •๋„ ๊ณ ๋ ค๋ฅผ ํ•ด์ค˜์•ผ ํ•  ๊ฒƒ์ด๋‹ค.

๋‹คํฌ๋ชจ๋“œ

iOS13๋ถ€ํ„ฐ ์ง€์›ํ•˜์—ฌ, ์‹œ์Šคํ…œ์ ์œผ๋กœ ์ ์šฉ์ด ๋˜์—ˆ๋‹ค. Xcode์˜ ๋””ํดํŠธ ์„ค์ •์€ ๋ผ์ดํŠธ๋ชจ๋“œ, ๋‹คํฌ๋ชจ๋“œ๋ฅผ ๋ชจ๋‘ ์ง€์›ํ•˜๋Š” ์ƒํƒœ์ด๋‹ค. ๊ทธ๋ ‡๊ธฐ์— ํ•œ ๊ฐ€์ง€๋กœ ์ œํ•œํ•˜๊ณ  ์‹ถ์œผ๋ฉด ๋”ฐ๋กœ ์„ค์ •์ด ํ•„์š”ํ•˜๋‹ค. ์•„๋ž˜์—์„œ ํ™•์ธ ๋ฐ”๋žŒ.


iOS14

์•ฑ์ด ์‹คํ–‰๋˜๋Š” ๋„์ค‘, ์ „ํ™”๊ฐ€ ํŒ์—… ํ˜•ํƒœ๋กœ ์˜จ๋‹ค๊ณ  ํ•ด์„œ Inactive ์ƒํƒœ๊ฐ€ ๋˜๋Š” ๊ฒƒ์€ ์•„๋‹ˆ๋‹ค. ์ „ํ™” ํ™”๋ฉด์œผ๋กœ ๋„˜์–ด๊ฐ”์„ ๋•Œ Inactive ์ƒํƒœ๊ฐ€ ๋œ๋‹ค. ์‹œ์Šคํ…œ์— ์˜ํ•ด ๊ตฌํ˜„๋˜๋Š” ๊ฒƒ์ด๊ธฐ ๋•Œ๋ฌธ์— ํŒ์—…์€ Active ์ƒํƒœ๋กœ ๋ณด์ง€ ์•Š๋Š”๋‹ค.

pip ๋ชจ๋“œ๋กœ ๋– ์žˆ๋”๋ผ๋„ ํ˜„์žฌ active ์ƒํƒœ๋กœ ๋„์›Œ์ง„ ์•ฑ์€ ์ƒํƒœ๊ฐ€ ์œ ์ง€๋œ๋‹ค.

pip ๋ชจ๋“œ๋Š” ์ฐฝ ๋ชจ๋“œ๋ฅผ ์˜๋ฏธํ•œ๋‹ค. ์œ ํŠœ๋ธŒ์—์„œ ์ฐฝ ๋ชจ๋“œ๋ฅผ ์ด์šฉํ•˜๋Š” ๊ฒƒ์ด ๊ฐ€๋Šฅํ•ด์กŒ๋‹ค.


available attribute keyword (์ฝ”๋“œ์˜ ๋ฒ„์ „ ๋Œ€์‘์„ ์–ด๋–ป๊ฒŒ ํ•ด์•ผ ํ• ๊นŒ?)

@available(iOS 13.0, *) // 13.0 ๋ฒ„์ „ ์ด์ƒ์—์„œ๋งŒ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•˜๋‹ค.

Snippet ์ž‘์„ฑํ•ด์„œ ์‚ฌ์šฉํ•˜์ž :)

swift5.6๋ถ€ํ„ฐ unavailable keyword๊ฐ€ ์ƒ๊ฒผ๋‹ค๊ณ  ํ•œ๋‹ค. (์˜คํ˜ธ๋ผ.. ์ฐพ์•„๋ด์•ผ์ง€)

๋” ๋งŽ์€ ๋‚ด์šฉ์€ TIL - #available, @available ์ฐธ๊ณ  ๋ฐ”๋žŒ.


Not Running์ธ์ง€ Background์ธ์ง€ ๊ทธ ์ƒํƒœ๊ฐ€ ๊ถ๊ธˆํ•˜๋‹ค.

ํ™ˆํ™”๋ฉด์„ ๋ฐ‘์—์„œ ์œ„๋กœ ์˜ฌ๋ฆฌ๋ฉด ์‚ฌ์šฉํ–ˆ๋˜ ์•ฑ์˜ ๋ชฉ๋ก์„ ์ญ‰ ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

๋ชจ๋“  ์•ฑ์ด Background ์ƒํƒœ์— ์žˆ๋Š” ๊ฒƒ์€ ์•„๋‹ˆ๋‹ค. ์‹ค์ œ๋กœ os์— ์˜ํ•ด ์ผ์ • ์‹œ๊ฐ„์ด ์ง€๋‚˜๋ฉด ๋ฉ”๋ชจ๋ฆฌ ์ •๋ฆฌ๊ฐ€ ์•Œ์•„์„œ ์ง„ํ–‰๋œ๋‹ค. ๊ทธ ์ฐจ์ด๋ฅผ ํ™•์ธํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด Background ์ƒํƒœ๋กœ ์•ฑ์„ ์˜ค๋ž˜ ์ผœ๋†“๊ณ  ํ•˜๋‚˜์”ฉ ํ™•์ธํ•ด๋ณด์ž. ์–ด๋–ค ์•ฑ์€ Launchscreen๋ถ€ํ„ฐ ์‹œ์ž‘๋˜๋Š” ์•ฑ์ด ์žˆ๊ณ , ์–ด๋–ค ์•ฑ์€ ๊ฐ€์žฅ ๋งˆ์ง€๋ง‰์œผ๋กœ ์‚ฌ์šฉํ•œ ํ™”๋ฉด์ด ๋‚˜์˜ฌ ๊ฒƒ์ด๋‹ค. ์ „์ž๋Š” Not Running ์ƒํƒœ๊ฐ€ ๋˜์–ด๋ฒ„๋ฆฐ ๊ฒƒ์ด๊ณ , ํ›„์ž๋Š” Background ์ƒํƒœ์ธ ๊ฒƒ์ด๋‹ค.

๋””๋ฐ”์ด์Šค ์„ฑ๋Šฅ, ์šฉ๋Ÿ‰, ๋ฐฐํ„ฐ๋ฆฌ, ์ €์ „๋ ฅ ๋ชจ๋“œ ๋“ฑ์— ๋”ฐ๋ผ์„œ๋„ ๋ฉ”๋ชจ๋ฆฌ ์ •๋ฆฌ ์ƒํ™ฉ์ด ๋‹ฌ๋ผ์ง„๋‹ค.


๋‹คํฌ๋ชจ๋“œ์™€ ์ปฌ๋Ÿฌ ์ง€์ •

๋‹คํฌ๋ชจ๋“œ on/off์— ๋”ฐ๋ผ์„œ Label์˜ ์ƒ‰์ƒ์ด ๋ณ€๊ฒฝ๋˜๊ณ  ์žˆ๋‹ค.

Black Color vs Label Color

๋‘˜ ๋‹ค ๊ฒ€์€์ƒ‰์ธ ๊ฒƒ ๊ฐ™์€๋ฐ ๋ฌด์Šจ ์ฐจ์ด๊ฐ€ ์žˆ์ง€?
๋‹คํฌ๋ชจ๋“œ๋ฅผ ์ ์šฉ์‹œ์ผœ๋ณด์ž.
Black์ฒ˜๋Ÿผ ์ƒ‰์ƒ์˜ ์ด๋ฆ„์ด ์ •ํ™•ํ•˜๊ฒŒ ๋ช…์‹œ๋œ ๊ฒƒ์€ ์–ด๋–ค ๋ชจ๋“œ์—์„œ๋“ ์ง€ ์ƒ‰์ƒ์ด ์œ ์ง€๋œ๋‹ค. (ํ•œ ๊ฐ€์ง€ ์ƒ‰์ƒ์œผ๋กœ ์œ ์ง€๋จ!)

System Color(+ ์˜๋„์ ์œผ๋กœ ๋„ค์ด๋ฐ์ด ๋“ค์–ด๊ฐ„ ์ƒ‰์ƒ)

iOS13๋ถ€ํ„ฐ ๋“ฑ์žฅํ•˜์˜€๋‹ค. ๋‹คํฌ๋ชจ๋“œ ๋Œ€์‘์„ ์œ„ํ•ด ๋‘ ๊ฐ€์ง€ ์ปฌ๋Ÿฌ๋ฅผ ์ง€๋‹ˆ๊ณ  ์žˆ๋‹ค.

์ปค์Šคํ…€ ์ปฌ๋Ÿฌ

์‚ฌ์šฉ์ž๊ฐ€ ์ผ๋ฐ˜์ ์œผ๋กœ ์ •์˜ํ•œ ์ปค์Šคํ…€ ์ปฌ๋Ÿฌ๋Š” ๋ฐ˜์ „(๋‹คํฌ ๋ชจ๋“œ์— ๋”ฐ๋ผ ์ƒ‰์ƒ ๋ฐ˜์ „)๋˜์ง€ ์•Š๋Š”๋‹ค.
๊ฑฑ์ • ๋งˆ๋ผ, Asset Catalog๋ฅผ ์ด์šฉํ•ด์„œ ๋‹คํฌ๋ชจ๋“œ์— ๋Œ€์‘ํ•  ์ˆ˜ ์žˆ๋Š” ์ƒ‰์ƒ์„ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค.

Asset Catalog๋กœ ๋‹คํฌ๋ชจ๋“œ ์ ์šฉํ•˜๊ธฐ

  • Any, Dark (iOS 13.0 ์ด์ƒ์ด๋ผ๋ฉด ์ƒ๊ด€์—†๋‹ค.)
  • Any, Light, Dark (๋งŒ์•ฝ ๊ทธ ์ดํ•˜์˜ ๋ฒ„์ „๊นŒ์ง€ ์ปจํŠธ๋กคํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด ์‚ฌ์šฉํ•˜์ž.)
  • Accent Color

๋งŒ์•ฝ์— ๋‹คํฌ๋ชจ๋“œ๋ฅผ ๋Œ€์‘ํ•˜๊ณ  ์‹ถ์ง€ ์•Š๋‹ค๋ฉด!

์‹ค์ œ ์•ฑ ์‚ฌ๋ก€

  • ์œ ํŠœ๋ธŒ, ์ธ์Šคํƒ€๊ทธ๋žจ : ๋‹คํฌ๋ชจ๋“œ ๋Œ€์‘
  • ๋ฐฐ๋‹ฌ์˜ ๋ฏผ์กฑ : ๋‹คํฌ๋ชจ๋“œ ์ œํ•œ

๋‹คํฌ ๋ชจ๋“œ ์ œํ•œ ๋ฐฉ๋ฒ•

๋ช…์‹œ์ ์œผ๋กœ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ฒ ๋‹ค๊ณ  ์„ค์ •ํ•˜์ž. Info.plist์—์„œ ์ง€์ •ํ•  ์ˆ˜ ์žˆ์Œ.
Info.plist๋Š” source code๋กœ๋„ ๋ณผ ์ˆ˜ ์žˆ์œผ๋‹ˆ ์ทจํ–ฅ๊ป ์ž‘์—…ํ•˜์ž.

แ„‰แ…ณแ„แ…ณแ„…แ…ตแ†ซแ„‰แ…ฃแ†บ 2022-07-06 แ„‹แ…ฉแ„Œแ…ฅแ†ซ 10 38 47


value ๊ฐ’์„ ์†Œ๋ฌธ์ž๋กœ ์“ฐ๋ฉด ๋ฆฌ์  ์‚ฌ์œ ๊ฐ€ ๋  ์ˆ˜ ์žˆ๋‹ค ใ…Žใ…Ž

UIUserInterfaceStyle๊ณผ Appearance(์ตœ๊ทผ)๋Š” ๊ฐ™์€ ์šฉ์–ด์ด๋‹ค. ๋ฒ„์ „ ์—…๋ฐ์ดํŠธ ๋˜๋ฉด์„œ ์ด๋ฆ„์ด ๋ฐ”๋€ ๊ฒƒ์ด๋‹ˆ ์ฐธ๊ณ !

๊ฐœ์ธ ์•ฑ์ด๋‚˜ ํฌ๊ฒŒ UI๊ฐ€ ์ค‘์š”ํ•œ ํ”„๋กœ์ ํŠธ๊ฐ€ ์•„๋‹ˆ๋ผ๋ฉด ๋Œ€์‘์„ ํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์ด ๋ฆฌ์†Œ์Šค๊ฐ€ ์กฐ๊ธˆ์€ ๋œ ๋“œ๋Š” ๋ฐฉ๋ฒ•์ผ ๊ฒƒ ๊ฐ™๋‹ค. ๋‹คํฌ๋ชจ๋“œ๋งŒ ์“ฐ๋Š” ๋ฐฉ๋ฒ•์€ ๋”ฐ๋กœ ์—†๋‹ค. ํ•œ ๊ฐ€์ง€ ์ƒ‰์ƒ๋งŒ ์“ฐ๋Š” ๋ฐฉ์‹์œผ๋กœ ๋™์ผํ•˜๊ฒŒ ํ•ด์ฃผ๋ฉด ๋œ๋‹ค. (Light ๋ผ๊ณ  ์„ค์ •ํ•˜๋ฉด ๋จ)

Apple Design Resources

https://developer.apple.com/design/resources/

๋‹คํฌ๋ชจ๋“œ, ๋ผ์ดํŠธ๋ชจ๋“œ ์ปฌ๋Ÿฌ ์…‹์ด ๋””์ž์ธ ๋˜์–ด ์žˆ๋Š” ๊ฒŒ ํฅ๋ฏธ๋กญ๋‹ค.
๊ทธ ์™ธ์— UI Components๋„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.


๊ฐ€๋กœ๋ชจ๋“œ

Device Orientation์—์„œ ์„ค์ • ๋˜๋Š” ์ œํ•œ์ด ๊ฐ€๋Šฅํ•˜๋‹ค.
๊ธฐ๊ธฐ ์ž…์žฅ์—์„œ ๊ฐ€๋กœ๋ชจ๋“œ๋ฅผ ํŒ๋‹จํ•˜๋Š” ๊ฒƒ์€ ๊ฐ€์†๋„๋ฅผ ๊ธฐ์ค€์œผ๋กœ ํŒ๋‹จํ•œ๋‹ค.

แ„‰แ…ณแ„แ…ณแ„…แ…ตแ†ซแ„‰แ…ฃแ†บ 2022-07-06 แ„‹แ…ฉแ„Œแ…ฅแ†ซ 10 46 28

  1. Portrait
    ์„ธ๋กœ ๋ชจ๋“œ
  2. Upside Down
    180๋„ ์ „ํ™˜, ์ด๊ฒƒ์€ iPad์—๋งŒ ์ ์šฉ(์™œ๋ƒํ•˜๋ฉด ์•„์ดํฐ์—๋Š” ๋…ธ์น˜๊ฐ€ ์žˆ๊ธฐ ๋•Œ๋ฌธ)
  3. Landscape Left
    ๊ฐ€๋กœ๋ชจ๋“œ, ์™ผ์ชฝ์œผ๋กœ ํšŒ์ „
  4. Landscape Right
    ๊ฐ€๋กœ๋ชจ๋“œ, ์˜ค๋ฅธ์ชฝ์œผ๋กœ ํšŒ์ „

TARGETS - Build Settings๊นŒ์ง€ ๋ฐ”๋€Œ์–ด์žˆ์–ด์•ผ ์ž˜ ์ ์šฉ์ด ๋œ ๊ฒƒ์ด๋‹ค.

General์—์„œ ์ผ๋ถ€ ์„ค์ •์„ ์ง„ํ–‰ํ•ด๋„ Build Settings์— ์ ์šฉ์ด ์•ˆ ๋˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ์žˆ๋‹ค.
Build Settings๋Š” ๊ฐœ๋ฐœ์ž๊ฐ€ ์ž์ฃผ ๋ณ€๊ฒฝํ•˜๋Š” ๋‚ด์šฉ๋“ค์ด ๋‹ด๊ฒจ์žˆ๋‹ค.


Project, Target

๊ธฐ๋ณธ์ ์œผ๋กœ Project์—์„œ ์„ค์ •ํ•œ ๊ฐ’์ด Target์œผ๋กœ ์ƒ์†์ด ๋œ๋‹ค.

Target์€ ์—ฌ๋Ÿฌ ๊ฐœ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ๊ฐ๊ฐ์˜ ์„ค์ •์ด ๋‹ฌ๋ผ์งˆ ์ˆ˜ ์žˆ๋‹ค.
Widget, Keyboard, ..., Extensions ๋“ฑ ์—ฌ๋Ÿฌ ๊ฐœ์˜ Target์ด ์ƒ๊ธธ ์ˆ˜ ์žˆ๋‹ค.


UIWindow

์‹ค์งˆ์ ์œผ๋กœ ๋ˆˆ์— ๋ณด์ด๋Š” ํ™”๋ฉด์€ ์•„๋‹ˆ๋‹ค.
๋น„์ถฐ์ฃผ๋Š” ๊ฑฐ์šธ์ด๋ผ๊ณ  ์ƒ๊ฐํ•˜๋ฉด ํŽธํ•˜๋‹ค. (๋ทฐ ์ปจํŠธ๋กค๋Ÿฌ๋ฅผ ๋น„์ถฐ์ฃผ๋Š” ํ†ต๋กœ)
์–ด๋–ค ๋ฒ„์ „์ด๋“  UIWindow๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.

์•„์ดํฐ์€ ๋‹จ์ผ ํ™”๋ฉด์ธ๋ฐ ์–ด๋–ค ๋ทฐ ์ปจํŠธ๋กค๋Ÿฌ๋ฅผ ๋ณด์—ฌ์ค„ ์ˆ˜ ์žˆ์„๊นŒ?

UIWindow๊ฐ€ ๊ทธ๊ฒƒ์„ ๊ด€์žฅํ•œ๋‹ค.

13.0 ์ด์ „ ๋ฒ„์ „์—์„œ ํ™”๋ฉด์„ ๋น„์ถฐ์ฃผ๊ธฐ ์œ„ํ•ด์„œ๋Š” window ํ”„๋กœํผํ‹ฐ๋ฅผ AppDelegate์—์„œ ์„ ์–ธํ•ด์ฃผ์–ด์•ผ ํ•œ๋‹ค.

์™œ App Delegate์—์„œ window ํ”„๋กœํผํ‹ฐ๋ฅผ ์„ ์–ธํ•ด์ค˜์•ผ ํ•˜๋‚˜์š”? ์•ˆ ๊ทธ๋Ÿฌ๋ฉด ๊นŒ๋งฃ๊ฒŒ ํ™”๋ฉด์ด ๋‚˜์˜จ๋‹ค.
iOS13์ด์ „์—๋Š” Scene Delegate ๊ฐœ๋…์ด ์—†๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.


sleep() ๋ฉ”์„œ๋“œ๋ฅผ ์ด์šฉํ•ด Launch Screen ๋™์ž‘ ์‹œ๊ฐ„ ์กฐ์ •

@main
class AppDelegate: UIResponder, UIApplicationDelegate {

    var window: UIWindow?

    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
        sleep(2)        
        return true
    }
}

time sleeping์„ ํ†ตํ•ด์„œ ๋Ÿฐ์น˜ ์Šคํฌ๋ฆฐ์˜ ๋กœ๋”ฉ ์‹œ๊ฐ„์„ ์กฐ์ •ํ•  ์ˆ˜๋Š” ์žˆ์œผ๋‚˜ ๊ทธ๋ ‡๊ฒŒ ๊ถŒ์žฅํ•˜์ง€๋Š” ์•Š๋Š” ๋ฐฉ๋ฒ•์ด๋‹ค.
AppDelegate์—์„œ Window ํ”„๋กœํผํ‹ฐ๋ฅผ ์„ ์–ธํ•˜๋ฉด iOS 12 ~ 15 ๋ชจ๋‘ ๋Œ€์‘ ๊ฐ€๋Šฅ


IBOutlet์ด ์ •์ƒ์ ์œผ๋กœ ์—ฐ๊ฒฐ์ด ์ž˜ ๋˜์ง€ ์•Š์„๋•Œ

  1. ์ง์ ‘ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๊ณ , ์—ญ์œผ๋กœ ์—ฐ๊ฒฐํ•˜๊ธฐ
  2. Clean Build ์‹คํ–‰ํ•˜๊ธฐ (cmd+shift+k)

UITextField

text ํ”„๋กœํ„ฐํ”ผ์™€ placeholder ํ”„๋กœํผํ‹ฐ๋Š” ๋‹ค๋ฅด๋‹ค. (์˜์—ญ ๊ตฌ๋ถ„)

UIButton

Button์˜ State๋Š” ์—ฌ๋Ÿฌ ๊ฐ€์ง€๊ฐ€ ์žˆ๋‹ค. ๊ทธ ์ค‘์—์„œ normal, highlighted๋ฅผ ๋จผ์ € ์‚ดํŽด๋ณด์ž

  • .normal (๋ฒ„ํŠผ์˜ ๊ธฐ๋ณธ ์ƒํƒœ)
  • .highlighted (๋ฒ„ํŠผ์„ ๋ˆŒ๋ €์„ ๋•Œ)

Button์˜ IBAction์„ ์—ฐ๊ฒฐํ•  ๋•Œ๋Š” sender์˜ ํƒ€์ž…์„ Any๊ฐ€ ์•„๋‹Œ UIButton์œผ๋กœ ์ง€์ •ํ•ด์ฃผ๋Š” ๊ฒƒ์ด ์ข‹๋‹ค. ์™œ ์ผ๊นŒ?


Keyboard๊ฐ€ ์ •์ƒ์ ์œผ๋กœ ์˜ฌ๋ผ์˜ค์ง€ ์•Š์„ ๋•Œ

๋ฌผ๋ฆฌ์ (ํ•˜๋“œ์›จ์–ด) ํ‚ค๋ณด๋“œ๊ฐ€ ์—ฐ๊ฒฐ ํ•ด์ œ - ๊ทธ๋Ÿผ ์ž๋™์œผ๋กœ ํ…์ŠคํŠธ ํ•„๋“œ์— ๊ฐ’์„ ์ž…๋ ฅํ•˜๋ ค๊ณ  ํ•  ๋•Œ ์†Œํ”„ํŠธ์›จ์–ด ํ‚ค๋ณด๋“œ๊ฐ€ ์˜ฌ๋ผ์˜จ๋‹ค.
์†Œํ”„ํŠธ์›จ์–ด ํ‚ค๋ณด๋“œ ์ง์ ‘ ์˜ฌ๋ฆฌ๋Š” ๋ฒ• (cmd+k)


IBOutlet๊ณผ IBAction

๋‘˜ ๋‹ค ์ธํ„ฐํŽ˜์ด์Šค ๋นŒ๋” ์†Œ์†

  • Outlet: UI ๊ด€๋ จ๋œ ๋กœ์ง
  • Action: ๊ธฐ๋Šฅ ๊ด€๋ จ๋œ ๋กœ์ง

ํ‚ค๋ณด๋“œ ๋‚ด๋ฆฌ๊ธฐ์™€ Tap Gesture

    1. ๊ฐ€์žฅ ์›๋ก ์ ์ธ ๋ฐฉ๋ฒ•
      ๋ฒ„ํŠผ์„ ๋ฐ”ํƒ• ํฌ๊ธฐ ๋งŒํผ ์ฑ„์šด๋‹ค. ๋ฒ„ํŠผ์„ ๋ˆŒ๋ €์„ ๋•Œ ์•ก์…˜์€ ๋˜๊ฒ ์ง€๋งŒ ๊ฒน์น˜๋Š” ์˜์—ญ์— ๋Œ€ํ•œ ๋Œ€์‘์ด ๋˜์ง€ ์•Š๋Š”๋‹ค. ์ฆ‰ ํ…์ŠคํŠธ ํ•„๋“œ๋‚˜, ๋‹ค๋ฅธ ๋ฒ„ํŠผ์— ๋Œ€ํ•œ ๋™์ž‘์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์—†๋‹ค.
    2. ์ œ์Šค์ฒ˜(tap gesture)์˜ ์ด์šฉ 
    3. @IBAction func tapGestureDidTapped(_ sender: Any) { view.endEditing(true) // ๋ชจ๋“  ํŽธ์ง‘์ด ๋๋‚ฌ๋‹ค. }
  • view์˜ ๋ชจ๋“  ํŽธ์ง‘์„ ์ข…๋ฃŒํ•œ๋‹ค.
  • Gesture์˜ ๊ฒฝ์šฐ Layer์™€ ์ƒ๊ด€์—†๋‹ค. Control ์˜์—ญ์„ ์ œ์™ธํ•˜๊ณ  ๋ชจ๋‘ ๋™์ž‘ํ•˜๊ฒŒ ๋œ๋‹ค.
  • view.endEditing(:_) ๋ฉ”์†Œ๋“œ๋Š” ๋ณธ์งˆ์ ์œผ๋กœ ํ‚ค๋ณด๋“œ๋ฅผ ๋‚ด๋ฆฌ๋Š” ์ฝ”๋“œ๋Š” ์•„๋‹ˆ๋‹ค.
์˜ค๋ธŒ์ ํŠธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์—์„œ tap gesture๋ฅผ ์˜ฌ๋ฆฌ๋ฉด ๊ทธ๋ƒฅ Superview์— ์˜ฌ๋ผ๊ฐ€๋Š” ๊ฑธ๊นŒ?
์—ฌ๋Ÿฌ ๊ฐœ๋ฅผ ๋”ฐ๋กœ ์˜ฌ๋ ธ๋Š”๋ฐ ๋™์ž‘์ด ์ค‘์ฒฉ๋˜๋Š” ๊ฒƒ ๊ฐ™์•„์„œ ํ™•์ธํ•ด๋ด์•ผ ํ•  ๊ฒƒ ๊ฐ™๋‹ค.