Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. Weโ€™ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[220706] TIL #8

Closed
Taehyeon-Kim opened this issue Jul 5, 2022 · 0 comments
Closed

[220706] TIL #8

Taehyeon-Kim opened this issue Jul 5, 2022 · 0 comments
Assignees

Comments

@Taehyeon-Kim
Copy link
Owner

Taehyeon-Kim commented Jul 5, 2022

๐Ÿชด 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๋ผ๊ณ  ๋ถ€๋ฅธ๋‹ค.

  4. Background
    ์•ฑ์ด ํ™”๋ฉด์— ๋ณด์ด์ง€ ์•Š์ง€๋งŒ ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•˜๊ณ  ์žˆ๋Š” ์ƒํƒœ๋ฅผ ๋งํ•œ๋‹ค.

  5. 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)์˜ ์ด์šฉ

์˜ค๋ธŒ์ ํŠธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์—์„œ tap gesture๋ฅผ ์˜ฌ๋ฆฌ๋ฉด ๊ทธ๋ƒฅ Superview์— ์˜ฌ๋ผ๊ฐ€๋Š” ๊ฑธ๊นŒ?

@IBAction func tapGestureDidTapped(_ sender: Any) {
    view.endEditing(true) // ๋ชจ๋“  ํŽธ์ง‘์ด ๋๋‚ฌ๋‹ค.
}
  • view์˜ ๋ชจ๋“  ํŽธ์ง‘์„ ์ข…๋ฃŒํ•œ๋‹ค.
  • Gesture์˜ ๊ฒฝ์šฐ Layer์™€ ์ƒ๊ด€์—†๋‹ค. Control ์˜์—ญ์„ ์ œ์™ธํ•˜๊ณ  ๋ชจ๋‘ ๋™์ž‘ํ•˜๊ฒŒ ๋œ๋‹ค.
  • view.endEditing(:_) ๋ฉ”์†Œ๋“œ๋Š” ๋ณธ์งˆ์ ์œผ๋กœ ํ‚ค๋ณด๋“œ๋ฅผ ๋‚ด๋ฆฌ๋Š” ์ฝ”๋“œ๋Š” ์•„๋‹ˆ๋‹ค.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

1 participant