๐ŸŒฑ 6์ฃผ์ฐจ: NotificationCenter, CLLocationManager, MKMapView, UIPageViewController

2023. 8. 27. 23:53ยท๐ŸŒฑ SeSAC iOS 3๊ธฐ

6์ฃผ์ฐจ ๊ธฐ๋ก: NotificationCenter, Map, UIPageViewController

 

๐Ÿง ๋ฌด์—‡์„ ๋ฐฐ์› ๋‚˜?

- NotificationCenter

- CLLocationManager, MKMapView (์œ„์น˜ ๊ถŒํ•œ)

- UIPageViewController

- Storyboard ์—†์ด ์ฝ”๋“œ๋ฒ ์ด์Šค๋กœ UI๋งŒ๋“ค๊ธฐ (snapKit ์‚ฌ์šฉ)

- ์นด๋ฉ”๋ผ ๊ถŒํ•œ + ๊ฐค๋Ÿฌ๋ฆฌ ๊ถŒํ•œ ( UIImagePickerController, UIFontPickerViewController, UIColorPickerViewController)

- ์ œ๋„ค๋ฆญ : ํƒ€์ž…์— ์œ ์—ฐํ•˜๊ฒŒ ๋Œ€์‘ํ•˜๊ธฐ ์œ„ํ•œ ์š”์†Œ

 

๐Ÿ”จ ์˜ˆ์ œ

- ํ…Œ์ด๋ธ”๋ทฐ๋ฅผ ํ™œ์šฉํ•ด์„œ <๋”๋ณด๊ธฐ> ๋งŒ๋“ค๊ธฐ

- onboardingViewController ๋งŒ๋“ค๊ธฐ

- CLLocationManager, MKMapView ์‚ฌ์šฉํ•˜๊ธฐ

 

๐Ÿ“š ๊ณผ์ œ

- NotificationCenter๋ฅผ ํ™œ์šฉํ•ด์„œ ์•Œ๋ฆผ์„ผํ„ฐ + ํฌ๊ทธ๋ผ์šด๋“œ์— ์•Œ๋ฆผ ๋„์šฐ๊ธฐ

- ์ฝ”๋“œ๋ฒ ์ด์Šค๋กœ UI ๋งŒ๋“ค๊ธฐ

- Media Project ์‹ฌํ™” (UIPageViewController๋ฅผ ํ™œ์šฉํ•ด์„œ ์˜จ๋ณด๋”ฉ ํ™”๋ฉด ๋งŒ๋“ค๊ธฐ)

- ๋‹ค๋งˆ๊ณ ์น˜ ํ”„๋กœ์ ํŠธ ๋ฆฌํŒฉํ† ๋ง (์ˆ˜์—… ๋•Œ ๋ฐฐ์šด ์š”์†Œ๋“ค๋กœ ์ถ”๊ฐ€ ๋ฐ ๊ฐœ์„ )

 

 

 


 

 

๐Ÿ’ฆ ๋ณต๊ธฐ

 

โœ”๏ธ notificatonCenter

- ์ฝ”๋“œ๋ฅผ ์™ธ์šฐ์ง€ ์•Š์•„๋„ ๋œ๋‹ค๋Š” ์ƒ๊ฐ์„ ์ฒ˜์Œ ์ œ๋Œ€๋กœ ํ•˜๊ฒŒ ๋งŒ๋“  notificatonCenter. ๊ธฐ๋ณธ์ ์ธ ๊ฐœ๋…๋งŒ ์ •๋ฆฌํ–ˆ๋‹ค.

- iOSํ™˜๊ฒฝ์—์„œ ์•ฑ ๊ฐœ๋ฐœ์„ ํ•  ๋•Œ ์ •๋ง ์ค‘์š”ํ•˜๊ฒŒ ์ƒ๊ฐํ•ด์•ผํ•˜๋Š” ๊ฑด ์‚ฌ์šฉ์ž์˜ ๊ถŒํ•œ์ธ ๊ฒƒ ๊ฐ™๋‹ค. 6์ฃผ์ฐจ์— ๋ฐฐ์šด ์š”์†Œ ์ค‘ ์‚ฌ์šฉ์ž์˜ ๊ถŒํ•œ ์•ˆ ๋ฌผ์œผ๋ฉด ์„ญ์„ญํ•  ์ •๋„.

 

  • ์œ ์ €๊ฐ€ ๊ถŒํ•œ ํ—ˆ์šฉํ•œ ๊ฒฝ์šฐ iOS ์•Œ๋ฆผ์„ผํ„ฐ์— ํ‘œ์‹œ
  • ์•ฑ ์žฌ์‚ฌ์šฉ๋ฅ ์— ๊ธฐ์—ฌํ•˜๋Š” ์—ญํ• ์„ ํ•œ๋‹ค -> ์•ฑ์ด ์ข…๋ฃŒ ๋œ ๊ฒฝ์šฐ์—๋„ ์‚ฌ์šฉ์ž์—๊ฒŒ ์ƒˆ๋กœ์šด ์ •๋ณด ํ‘œ์‹œ.
  • ํฌ๊ทธ๋ผ์šด๋“œ์— ์•ˆ ๋œจ๋Š” ๊ฒƒ์ด ๋””ํดํŠธ ์„ค์ •์ด๋ฏ€๋กœ, ๋„์›Œ์•ผํ•  ๋• ๋”ฐ๋กœ ์„ค์ •ํ•ด์ฃผ์–ด์•ผ ํ•œ๋‹ค. (์•ฑ๋”œ๋ฆฌ๊ฒŒ์ดํŠธ)
  • ์•Œ๋ฆผ์ด ๋œจ๋Š” ํ…€(timeInterval)์€ 60์ดˆ ์ดํ•˜๋กœ ์„ค์ •ํ•˜๊ณ  ์‹ถ์œผ๋ฉด false๋กœ ์„ค์ •ํ•ด์•ผํ•œ๋‹ค. (๋ทฐ์ปจํŠธ๋กค๋Ÿฌ)

 

Local vs Remote

  • local : ๊ฐ™์€ ๋‚ , ๊ฐ™์€ ์‹œ๊ฐ„, ๋น„์Šทํ•œ ๋‚ด์šฉ์˜ ์•Œ๋ฆผ์ด ์˜ค๋Š” ๊ฒƒ. ์—‘์Šค์ฝ”๋“œ์— ๋‚ด์žฅ๋œ ์ƒํƒœ.
    • ์•ฑ ๋‚ด ์•Œ๋ฆผ์„ ์ „๋‹ฌ
    • ๊ฐ™์€ ์‹œ๊ฐ„, ๋น„์Šทํ•œ ์ปจํ…์ธ  (๋””๋ฐ์ด, ์ผ๊ธฐ)
  • remote: ์ด๋ฒคํŠธ์„ฑ์œผ๋กœ ์„œ๋ฒ„์—์„œ ํ‘ธ์‹œ(์•Œ๋ฆผ์„ ๋ณด๋‚ธ) ๊ฒฝ์šฐ.
    • ์–ธ์ œ ์˜ฌ์ง€ ๋ชจ๋ฅด๊ณ , ์˜ฌ๋•Œ๋งˆ๋‹ค ๋‚ด์šฉ์ด ๋‹ฌ๋ผ์ง„๋‹ค.
    • ์„œ๋ฒ„์—์„œ ์•Œ๋ฆผ์„ ์ „๋‹ฌ

 

  • ์ฝ”๋“œ ์ •๋ฆฌ (๊ตฌ์ฒด์ ์ธ ์ฝ”๋“œ๋Š” ๋…ธ์„  ์ •๋ฆฌ ์ฐธ๊ณ *)
    • AppDelegate : ์•Œ๋ฆผ ๊ถŒํ•œ์— ๋Œ€ํ•œ ์„ค์ •
    • SceneDelegate : ๋…ธํ‹ฐ ์ •๋ณด๋ฅผ ์–ธ์ œ ์ง€์šธ ๊ฒƒ์ธ์ง€ + ๋ฑƒ์ง€ ๊ฐฏ์ˆ˜ 
    • viewController : ์•Œ๋ฆผ์— ๋Œ€ํ•œ ์ „๋ฐ˜์ ์ธ ์„ค์ • (์ปจํ…์ธ  ๋‚ด์šฉ, ์•Œ๋ฆผ ๋ณด๋‚ผ ํƒ€์ด๋ฐ ๋“ฑ)

 

 


 

โœ”๏ธ ๋ ˆ์ด์•„์›ƒ

 

- 6์ฃผ์ฐจ์—์„œ ๊ฐ€์žฅ ์ค‘์š”ํ–ˆ๋˜ ๊ฒŒ ์ฝ”๋“œ๋ฒ ์ด์Šค๋กœ ์ž‘์„ฑํ•˜๋Š” ๊ฒƒ์ด์—ˆ๋Š”๋ฐ, ์ฒ˜์Œ์—” ์ง€๊ธˆ ๋‚ด๊ฐ€ ์Šคํ† ๋ฆฌ๋ณด๋“œ ์—†์ด ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ๋‚˜? ์‹ถ์–ด์„œ ๋ถˆ์•ˆํ–ˆ์ง€๋งŒ 6์ฃผ๊ฐ„ ๋ฐฐ์šด ๊ฒƒ ์ค‘ ๊ฐ€์žฅ ์‹ ๋‚˜๊ณ  ์žฌ๋ฐŒ๊ฒŒ ๊ณต๋ถ€ํ–ˆ๋‹ค. ๋ฐฐ์›Œ์„œ ์•„๋Š” ๊ฒƒ์„ ์‘์šฉ ํ•œ๋‹ค๋Š”๊ฒŒ ์ด๋Ÿฐ๊ฑฐ๊ตฌ๋‚˜~ ์‹ถ์—ˆ๊ณ  ํŠนํžˆ ๊ฐœ์ธ์ ์œผ๋กœ ๋์—†๋Š” ๊ณ ํ†ต๋ฟ์ด์—ˆ๋˜(ใ…Žใ…Ž..) ๋„คํŠธ์›Œํฌํ†ต์‹  ํ•˜๋‹ค๊ฐ€ ๋„˜์–ด์™€์„œ ์ƒ๋Œ€์ ์œผ๋กœ ๋” ์žฌ๋ฐŒ๊ฒŒ ๋А๊ปด์กŒ๋˜ ๊ฒƒ ๊ฐ™๊ธฐ๋„ ํ•˜๊ณ ... 

 

 

  • content hugging : ์„ค์ •๊ฐ’์ด ๋” ํฐ ๊ฒŒ ์ž‘์•„์ง
  • content compression: ์„ค์ •๊ฐ’์ด ๋” ํฐ ๊ฒŒ ์ปค์ง
  • content hugging, content compression์˜ ์ˆซ์ž๋Š” ์„ค์ • ๊ฐ’ ์ฐจ์ด๋งŒ ๋‚œ๋‹ค๋ฉด ์–ด๋–ค ์ˆซ์ž๋“  ์ƒ๊ด€ ์—†์Œ. 
  • ๋ ˆ์ด์•„์›ƒ ์ž‘์„ฑ ๋ณ€์ฒœ์‚ฌ(?), ๊ฐ„๊ฒฐํ•ด์ง: NSLayoutConstraints → NSLayoutAnchor → snapKit
  • snapKit์œผ๋กœ ์ž‘์„ฑ ์‹œ:
    •  translatesAutoresizingMaskIntoConstraints = false ๋Š” snapkit๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์ƒ๋žต์ด ๊ฐ€๋Šฅํ•œ๋ฐ, snapkit์— ๋‚ด์žฅ๋˜์–ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.
    • addSubviewํ•˜๋Š” ์ˆœ์„œ๋Œ€๋กœ ๋ทฐ๊ฐ€ ์Œ“์ž„.
      • addSubView๋ฅผ ํ•˜์ง€ ์•Š์•˜๋‹ค๋ฉด? โฌ‡๏ธ

์‹ค์ œ๋กœ UI๋ฅผ ์ฝ”๋“œ๋กœ ์งœ๋ณด๋ฉด์„œ ๋‘์„ธ๋ฒˆ์”ฉ์€ ๋งŒ๋‚ฌ๋˜ ์˜ค๋ฅ˜

"Unable to activate constraint with anchors......" ์ด๋Ÿฐ ์˜ค๋ฅ˜๊ฐ€ ๋œฌ๋‹ค. 

 

  • left,right ๋Œ€์‹  leading, trailing์œผ๋กœ ์žก๋Š” ์ด์œ : ํ˜„์ง€ํ™”์— ๋Œ€์‘ํ•˜๊ธฐ ์œ„ํ•ด ์”€. (์˜ค๋ฅธ์ชฝ→์™ผ์ชฝ์œผ๋กœ ์ฝ๋Š” ๊ตญ๊ฐ€๋“ค์˜ ์‚ฌ์šฉ์ž๋“ค์„ ๊ณ ๋ คํ•จ. ๋ ˆํ”„ํŠธ,๋ผ์ดํŠธ๋ฅผ ์“ฐ๋ฉด ๋Œ€์‘์ด ๋˜์ง€ ์•Š์Œ.)

 

  • ์Šคํ† ๋ฆฌ๋ณด๋“œ ์—†์ด ์ฝ”๋“œ๊ตฌํ˜„ ์ค€๋น„:

1. info์—์„œ ๊ฐ€์žฅ ๋งˆ์ง€๋ง‰์˜ ๋งˆ์ง€๋ง‰ ์˜ต์…˜์—์„œ Storyboard Name์„ ์‚ญ์ œํ•œ๋‹ค.

 

2. BuildSetting์—์„œ Main์„ ํ™•์‹คํžˆ ์ง€์›Œ์ค€๋‹ค.

 

3. ์ด๋•Œ, ๋นŒ๋“œ๋ฅผ ํ•˜๋ฉด ์‹œ๋ฎฌ๋ ˆ์ดํ„ฐ๊ฐ€ ๊ฒ€์ •์ƒ‰ ํ™”๋ฉด์œผ๋กœ ๋œจ๋Š”๋ฐ ์ด๊ฑธ ํ•ด๊ฒฐํ•˜๋ ค๋ฉด sceneDelegate์—์„œ ์•„๋ž˜ ์ฝ”๋“œ๋ฅผ ์ถ”๊ฐ€ํ•ด์ฃผ๋ฉด ๋œ๋‹ค.

 

class SceneDelegate: UIResponder, UIWindowSceneDelegate {

    var window: UIWindow?


    func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) {
        // Use this method to optionally configure and attach the UIWindow `window` to the provided UIWindowScene `scene`.
        // If using a storyboard, the `window` property will automatically be initialized and attached to the scene.
        // This delegate does not imply the connecting scene or session are new (see `application:configurationForConnectingSceneSession` instead).
        guard let scene = (scene as? UIWindowScene) else { return }
        window = UIWindow(windowScene: scene)
        let vc = ๋ณด์ด๊ณ  ์‹ถ์€ ๋ทฐ์ปจํŠธ๋กค๋Ÿฌ()
        window?.rootViewController = vc
        window?.makeKeyAndVisible()
    }

 

 

 

  • ๋ฐ˜๋ณต์ ์œผ๋กœ ์‚ฌ์šฉ๋˜๋Š” UI๋Š” class ํŒŒ์ผ๋กœ ๋นผ์„œ ์ž‘์„ฑ ํ›„ ์ ์šฉํ•ด์„œ ํšจ์œจ์ ์ธ ์ฝ”๋“œ ์ž‘์„ฑ์„ ํ•œ๋‹ค.
  • classํŒŒ์ผ๋กœ ๋นผ์„œ ์ž‘์„ฑ ์‹œ ์œ ์˜์‚ฌํ•ญ: 
//ํŒŒ์ผ์„ ์ƒˆ๋กœ ํ•˜๋‚˜ ๋งŒ๋“ค์–ด์„œ ์•„๋ž˜์™€ ๊ฐ™์ด ๋ฐ˜๋ณต๋˜์„œ ์‚ฌ์šฉ๋˜๋Š” UI ์š”์†Œ ์„ค์ •์„ ์ž‘์„ฑํ•˜๋ฉด, 

class BlackRadiusTextField: UITextField {

    func setupView() {
        borderStyle = .none
        layer.borderColor = UIColor.yellow.cgColor
        layer.borderWidth = 1
        layer.cornerRadius = 3
        textColor = .black
        textAlignment = .center
        font = .boldSystemFont(ofSize: 13)
    }
}

// ์•„๋ž˜ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•ด์ฃผ์–ด์•ผ ํ•จ.
//(awakNib๊ฐ™์€ ์—ญํ• .) ์ฝ”๋“œ๋ฒ ์ด์Šค๋กœ ์ž‘์„ฑ ์‹œ ์ดˆ๊ธฐํ™” ๊ตฌ๋ฌธ์œผ๋กœ ์‚ฌ์šฉ


    override init(frame: CGRect) { //super class์— ๋Œ€ํ•œ ๊ฑฐ์•ผ = override //UIView (override)
        super.init(frame: frame)
        setupView()
    }
    
    
 //์•„๋ž˜ ์ฝ”๋“œ๋Š” ์ž๋™์œผ๋กœ ์ถ”๊ฐ€ํ•˜๋ผ๊ณ  ์•Œ๋ฆผ์ด ๋œจ๊ธฐ ๋•Œ๋ฌธ์—, ๊ทธ๋•Œ๋งˆ๋‹ค fix๋ฅผ ๋ˆŒ๋Ÿฌ ์†Œํ™˜์‹œ์ผœ๋„ ๋ฌด๊ด€.
 
 //NSCoding
    //XIB -> NIB ๋ณ€ํ™˜ ๊ณผ์ •์—์„œ ๊ฐ์ฒด ์ƒ์„ฑ ์‹œ ํ•„์š”ํ•œ init ๊ตฌ๋ฌธ (storyboard)
    //Interface Builder์—์„œ ์ƒ์„ฑ๋œ ๋ทฐ๋“ค์ด ์ดˆ๊ธฐํ™”๋  ๋•Œ ์‹คํ–‰๋˜๋Š” ๊ตฌ๋ฌธ!
    required init?(coder: NSCoder) { //NSCoding (required)/ ? = ์‹คํŒจ์‹œ ๊ตฌํ˜„์ด ์•ˆ๋˜๊ฒŒ ํ•จ.
        fatalError("init(coder:) has not been implemented")
    }

 

- ํ•˜๋‚˜๋Š” ์Šคํ† ๋ฆฌ๋ณด๋“œ์šฉ, ํ•˜๋‚˜๋Š” ์ฝ”๋“œ๋ฒ ์ด์Šค์šฉ์ธ๋ฐ ํ•ญ์ƒ ๋‘˜ ๋‹ค ์จ์ฃผ์–ด์•ผ ํ•œ๋‹ค.

 

 

 

 

  • ํ…Œ์ด๋ธ”๋ทฐ์— addSubViewํ•  ๋• view๊ฐ€ ์•„๋‹ˆ๋ผ contentView์— ํ•ด์ค„ ๊ฒƒ.

 

 

- view๋Š” viewController์— ์ถ”๊ฐ€ํ•  ๋•Œ,

- contentView๋Š” tableViewController์— ์…€์„ ์ถ”๊ฐ€ํ•  ๋•Œ ์‚ฌ์šฉ ๋˜์–ด์•ผ ํ•จ.

 

์ด์œ ๋Š” ์•„๋ž˜ ์ด๋ฏธ์ง€ ์ฐธ๊ณ .

 

 

 

 

 

 

(+)

 

 

์ˆ˜์—… ์ •๋ฆฌ๋…ธํŠธ๋ฅผ ๋ณด๋‹ค๊ฐ€ ๋ฐ‘๋„ ๋๋„์—†์ด 'storyboard'๋ฅผ ์—†์•ด์–ด ๋ผ๊ณ  ์ ์€ ๊ฒŒ ์›ƒ๊ฒผ๋‹ค. ๋งŽใ…‡ใ…ฃ... ๋†€๋žฌ์—ˆ๋‚˜๋ณธ๋ฐ?

 

 

 

 

 


 

 

 

 

โœ”๏ธ Privacy & Authorization

 

  • ๊ฐœ๋ฐœ์ž๊ฐ€ ํ•ญ์ƒ ๊ณ ๋ คํ•ด์•ผํ•˜๋Š” ๊ฑด ๊ธฐ์ˆ  ๋ณด๋‹ค ์‚ฌ์šฉ์ž์˜ ํŽธ์˜. -> ์–ด๋–ป๊ฒŒ ํ•˜๋ฉด ์‚ฌ์šฉ์ž ๊ฒฝํ—˜์„ ๋ฐฉํ•ดํ•˜์ง€ ์•Š๊ณ  ๋” ๋งŽ์€ ํ†ต์ œ๊ถŒ์„ ์ค„ ์ˆ˜ ์žˆ์„๊นŒ?
  • ์‚ฌ์šฉ์ž์˜ ํŽธ์˜๋ฅผ ๊ณ ๋ คํ•œ๋‹ค๋ฉด ์‚ฌ์šฉ์ž์—๊ฒŒ data privacy์— ๋Œ€ํ•ด ๋” ๋งŽ์€ ํ†ต์ œ๊ถŒ์„ ์ฃผ๋Š” ๊ฒƒ.
  • ํ•„์š” ์ด์ƒ์˜ ์ •๋ณด๋ฅผ ์š”์ฒญํ•˜์ง€ ์•Š์Œ์„ ํ†ตํ•ด ์‚ฌ์šฉ์ž์™€์˜ ์‹ ๋ขฐ ๊ตฌ์ถ• (๋ฆฌ์  ์‚ฌ์œ ๋กœ ๊ฐ€์žฅ ๋งŽ์Œ.)
  • ์›ํ•˜๋Š” ๊ฒƒ์„ ์ตœ์†Œํ™” ํ•จ์œผ๋กœ์จ ๋” ๋‚˜์€ ์‚ฌ์šฉ์ž ํ™˜๊ฒฝ์„ ์ œ๊ณต. (์‚ฌ์šฉ์ž์˜ ๋‹ˆ์ฆˆ๋ฅผ ์ž˜ ํŒŒ์•…ํ•ด์•ผํ•จ.)
    • iOS 13 ๋•Œ [ํ•œ๋ฒˆ ํ—ˆ์šฉ] ์˜ต์…˜์ด ๋“ฑ์žฅ. (ํ•œ๋ฒˆ ํ—ˆ์šฉ: ์ผ์‹œ์ ์œผ๋กœ ๊ถŒํ•œ ํ—ˆ์šฉ)
    • iOS 14 ๋•Œ ์ •ํ™•ํ•œ ์œ„์น˜์— ๋Œ€ํ•œ ํ—ˆ์šฉ (on/off) : ์‚ฌ์šฉ์ž๊ฐ€ offํ•˜๋ฉด ๊ด€๊ณต์„œ ๊ฐ™์€ public location ์ •๋ณด๋ฅผ ์œ„์น˜๋กœ ์ „๋‹ฌ.
    • ์œ„์น˜์„œ๋น„์Šค :
      • ์œ„์น˜ ์„œ๋น„์Šค๊ฐ€ ์ผœ์ ธ ์žˆ์œผ๋ฉด ๊ถŒํ•œ์š”์ฒญ ๊ฐ€๋Šฅ -> ๊ถŒํ•œํ—ˆ์šฉ or ๊ถŒํ•œ ๊ฑฐ๋ถ€ ์„ ํƒ์ง€ ์ œ๊ณต -> ๊ถŒํ•œ ํ—ˆ์šฉ์‹œ ์‚ฌ์šฉ์ž ์ •๋ณด์— ์ ‘๊ทผ ๊ฐ€๋Šฅ, ์ถ”ํ›„ ๊ฑฐ๋ถ€ ํ•  ์ˆ˜๋„ ์žˆ์Œ (๋‹ค ๋Œ€์‘ํ•ด์•ผํ•จ)
      • ๊บผ์ ธ ์žˆ์œผ๋ฉด (์• ์ดˆ์—) ๊ถŒํ•œ์š”์ฒญ ๋ถˆ๊ฐ€ -> ํ•„์ˆ˜์ ์ผ ๋• alert iOS ์‹œ์Šคํ…œ์œผ๋กœ ์œ ๋„ํ•ด์•ผํ•จ 
  • ์œ„์น˜ ์„œ๋น„์Šค ๋ฌธ๊ตฌ ์„ค์ •:

- ๊ฐœ์ธ์ ์œผ๋กœ ์กฐ๊ธˆ ๋œฌ๊ธˆ์—†๋‹ค๊ณ  ์ƒ๊ฐํ–ˆ๋Š”๋ฐ, Info์—์„œ ์„ค์ •ํ•ด์ฃผ์–ด์•ผ ํ•œ๋‹ค. ํ•ด๋‹น๋˜๋Š” Privacy ์ƒํ™ฉ์„ ์ถ”๊ฐ€ํ•ด์ฃผ๊ณ , Value์— ์›ํ•˜๋Š” ๋ฌธ๊ตฌ๋ฅผ ์ž‘์„ฑํ•ด์ฃผ๋ฉด ๋œ๋‹ค.

 

 

์˜ˆ์‹œ

- value์— "ํ˜„์žฌ ๋‚ ์”จ์— ๋Œ€ํ•œ ์ •๋ณด๋ฅผ ๊ฐ€์ง€๊ณ  ์˜ค๊ธฐ ์œ„ํ•ด ์œ„์น˜ ์ •๋ณด๊ฐ€ ํ•„์š”ํ•ด์š”."๋ฅผ ์ž…๋ ฅ ํ–ˆ์œผ๋ฉด ์œ„์™€ ๊ฐ™์ด ๋‚˜์˜จ๋‹ค.

 

 

 


 

 

โœ”๏ธ ์œ„์น˜ ๊ธฐ๋ฐ˜ ์„œ๋น„์Šค

 

//์œ„์น˜๊ธฐ๋ฐ˜ ์„œ๋น„์Šค ์ž‘์„ฑํ•  ๋•Œ ์žŠ์ง€ ๋ง๊ณ  import ํ•ด์•ผํ•˜๋Š” ๋‘ ๊ฐ€์ง€

import CoreLocation //์œ„์น˜
import MapKit //์ง€๋„

 

  • CLLocationManager
  • MKMapView

 

- ์œ„์น˜ ๊ธฐ๋ฐ˜ ์„œ๋น„์Šค๋Š” ์œ„ ๋‘ ๊ฐ€์ง€ ์š”์†Œ๋ฅผ ์ค‘์ ์œผ๋กœ ์ž‘์„ฑํ•˜๋Š”๋ฐ, ๊ณผ์ œ๋กœ ์ž‘์„ฑํ•˜๋‹ค ๋ณด๋‹ˆ ์‚ฌ์šฉ์ž์˜ ํ˜„์žฌ ์œ„์น˜ ๊ด€๋ จ๋œ ์ฝ”๋“œ๋ฅผ ๋จผ์ € ์ž‘์„ฑํ•˜๊ณ  ์ง€๋„ ๊ด€๋ จ๋œ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•ด์•ผ ์ž˜ ์ž‘๋™๋˜๋Š” ๊ฑฐ ๊ฐ™์•„์„œ CLLocationManger -> MKMapView ์ˆœ์„œ๋กœ ์ž‘์„ฑํ•˜๊ธฐ.

- extension์œผ๋กœ CLLocationManagerDelegate, MKMapViewDelegate ํ™œ์šฉํ•ด์„œ ์„ค์ •.

 

 

 

 


 

 

 

โœ”๏ธ UI PageViewController

 

์Šฌ๋ผ์ด๋“œ ๋“ฑ์˜ ์•ก์…˜์„ ํ†ตํ•ด ์—ฌ๋Ÿฌ ๋ทฐ์ปจํŠธ๋กค๋Ÿฌ๋ฅผ ํ•˜๋‚˜์˜ ๋ทฐ์ปจํŠธ๋กค๋Ÿฌ ์•ˆ์—์„œ ๊ด€๋ฆฌํ•˜๋ฉฐ ๋ณด์—ฌ์คŒ.

 

  • ๋ฐฐ์—ด๋กœ ๊ด€๋ฆฌํ•œ๋‹ค. 
  • Intro, WalkThrough, onboarding ๋“ฑ์œผ๋กœ ๋ถˆ๋ฆฌ๊ธฐ๋„ ํ•จ. (์•ฑ ์ตœ์ดˆ ์‹คํ–‰์‹œ ๋ณด์—ฌ์ฃผ๋Š” ํ™”๋ฉด ์—ญํ• )
  • ํŒŒ์ผ ์ƒ์„ฑ์‹œ UIPageViewController๋กœ ๋งŒ๋“ค์–ด์•ผํ•จ. (๊ทธ๋Ÿฐ๋ฐ ์ด๋ฆ„์€ viewController๋กœ ๋œธ

 

ํ™”๋ฉด ๋งŒ๋“ค๊ธฐ:

 

1. ๋ฐฐ์—ด ๋งŒ๋“ค๊ธฐ

 

class OnboardingViewController: UIPageViewController {

    var list: [UIViewController] = []
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        list = [FirstViewController(), SecondViewController(), ThirdViewController()]
    }

}

 

2. ํ”„๋กœํ† ์ฝœ ์†Œํ™˜

 

UIPageViewControllerDelegate, UIPageViewControllerDataSource //ํ•„์š”ํ•œ ํ”„๋กœํ† ์ฝœ


    delegate = self
    dataSource = self


//before
	func pageViewController(_ pageViewController: UIPageViewController, viewControllerBefore viewController: UIViewController) -> UIViewController? {
        
        guard let currentIndex = list.firstIndex(of: viewController) else { return nil }
        let previousIndex = currentIndex - 1
        return previousIndex < 0 ? nil : list[previousIndex]
        
    }
    
 //after 
    func pageViewController(_ pageViewController: UIPageViewController, viewControllerAfter viewController: UIViewController) -> UIViewController? {
        
        guard let currentIndex = list.firstIndex(of: viewController) else { return nil }
        let nextIndex = currentIndex + 1
        return nextIndex >= list.count ? nil : list[nextIndex]
        
    }

 

3. ์ฒซ ํ™”๋ฉด ๊ธฐ์ค€ ์ •ํ•˜๊ธฐ

 

guard let first = list.first else { return }
setViewControllers([first], direction: .forward, animated: true)

 

4. ํŽ˜์ด์ง€์ปจํŠธ๋กคํŽ˜์ด์ง€ ์ถ”๊ฐ€

 

func presentationCount(for pageViewController: UIPageViewController) -> Int {
        return list.count //์ด ํ•„์š”ํ•œ ๊ฐœ์ˆ˜
    }
    
    func presentationIndex(for pageViewController: UIPageViewController) -> Int {
        guard let first = viewControllers?.first, let index = list.firstIndex(of: first) else { return 0 }
        return index
    }

 

5. ํŽ˜์ด์ง€ ๋„˜์–ด๊ฐ€๋Š” ๊ฒƒ ์ •ํ•˜๊ธฐ (์ œ๋„ˆ๋ฆญ ํ™œ์šฉ)

 

    override init(transitionStyle style: UIPageViewController.TransitionStyle, navigationOrientation: UIPageViewController.NavigationOrientation, options: [UIPageViewController.OptionsKey : Any]? = nil) {
        super.init(transitionStyle: .scroll, navigationOrientation: .horizontal)
    }
    
    required init?(coder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }

 

- transitionStyle์˜ ๋””ํดํŠธ ์„ค์ •์€ .pageCurl์ธ๋ฐ, pageCurl์€ ์ƒ๊ฐ๋ณด๋‹ค ์‚ฌ์šฉ์ž์—๊ฒŒ ํ”ผ๋กœ๊ฐ์„ ์ค€๋‹ค๋Š” ์ ์„ ๊ณ ๋ คํ•  ๊ฒƒ.

 

 

 

 

 


 

๐Ÿ‘€ 6์ฃผ์ฐจ ํšŒ๊ณ :

 

- ๊ทธ๋™์•ˆ ๋ฐฐ์šด ๊ฑธ ์ฝ”๋“œ๋ฒ ์ด์Šค๋กœ ์˜ฎ๊ฒจ์˜ค๋Š” ๊ณผ์ •์— ๋ณต์Šตํ•˜๋Š” ๋ถ€๋ถ„์ด ๋งŽ์•„์„œ ์ง€๋‚œ 6์ฃผ๋ฅผ ํ†ตํ‹€์–ด ์ˆ˜์—… ๋“ค์œผ๋ฉฐ ์ดํ•ด๋„๊ฐ€ ๊ฐ€์žฅ ๋†’์•˜๋˜ ์ฃผ์˜€๋˜ ๊ฒƒ ๊ฐ™๋‹ค. ์ผ๋‹จ ์šฉ์–ด๋“ค์„ ๋งŽ์ด ์•Œ๊ฒŒ ๋œ ์  ๋•Œ๋ฌธ์— ์ดํ•ด๋„๊ฐ€ ์ข‹์•„์ง„ ๊ฒƒ ๊ฐ™์•„์„œ, ์ฃผ๋ง๋™์•ˆ ์ „์—๋Š” ๋ด๋„ ์ดํ•ด๊ฐ€ ์•ˆ๋˜๋˜ ์ˆ˜์—…์ž๋ฃŒ๋“ค์„ ๋ณด๋ฉฐ ๋‹ค์‹œ ๊ณต๋ถ€ํ–ˆ๋‹ค. ๋ฌธ๋ฒ•์€ ๋“œ๋””์–ด ์ดํ•ด๊ฐ€ ๋˜๊ธฐ ์‹œ์ž‘... ๐Ÿฅน ๋ฌผ๋ก  ์‘์šฉ์ด๋ผ๋˜๊ฐ€ ์•„์ง ์ดํ•ด๊ฐ€ ์ž˜ ์•ˆ๋˜์–ด์„œ ํ”ผํ•˜๋Š” ๋ฌธ๋ฒ• ๋“ฑ์ด ์žˆ์–ด์„œ ์—ฌ์ „ํžˆ ๊ฐˆ๊ธธ์ด ๊ตฌ๋งŒ๋ฆฌ์ง€๋งŒ.

- ๊ทธ๋ฆฌ๊ณ  ์„œ๋™์š” ๊ธฐ๋ฒ•์ฒ˜๋Ÿผ ์ฝ”๋“œ๋ฅผ ์™ธ์šฐ์ง€ ์•Š์•„๋„ ํ•„์š”ํ• ๋•Œ๋งˆ๋‹ค ์ฐพ์•„์„œ ์“ฐ๋ฉด ๋œ๋‹ค, ๋ฅผ ์ˆ˜์—…์—์„œ ์€์€ํ•˜๊ฒŒ ์ž์ฃผ ๋“ค์—ˆ๋”๋‹ˆ ์•Œ ์ˆ˜ ์—†๋Š” ๊ฐ•๋ฐ•์—์„œ ์กฐ๊ธˆ ๋ฒ—์–ด๋‚ฌ๋‹ค. ์ผ๋‹จ ํŒŒ์ผ์„ ์ ์  ์ƒํ™ฉ๋ณ„๋กœ ๋‚˜๋ˆ ์„œ ์ž‘์„ฑํ•˜๊ณ  ์žˆ๊ณ , ํ”„๋กœํ† ์ฝœ๋„ ์ž์ฃผ ์“ฐ๋‹ค๋ณด๋‹ˆ ์™ธ์šด๋‹ค๋Š” ๊ฑฐ ์ž์ฒด๊ฐ€... ์–ผ๋งˆ๋‚˜ ๋ง์ด ์•ˆ๋˜๋Š” ์ผ์ธ์ง€ ์•Œ์•˜๊ณ ใ…Žใ…Ž... ์ฝ”๋“œ ํ๋ฆ„์„ ์ดํ•ดํ•˜๋Š”๊ฒŒ ์™œ ์ค‘์š”ํ•œ์ง€ ์•Œ๊ฒŒ ๋œ 6์ฃผ์ฐจ.

- 7์ฃผ์ฐจ์—” ์—ฌ์œ ๊ฐ€ ๋‚˜๋ฉด ๋„คํŠธ์›Œํฌ ํ†ต์‹ ์„ ๋‹ค์‹œ ๊ณต๋ถ€ํ•ด์•ผํ•  ๊ฒƒ ๊ฐ™๋‹ค.

 

 

 

โ™ป๏ธ 5์ฃผ์ฐจ ๊ฐœ์„ ํ•œ ๋ถ€๋ถ„ ๋ชจ์Œ

 

- ๋‹ค๋งˆ๊ณ ์น˜ ํ”„๋กœ์ ํŠธ :

  • ํ™”๋ฉด์ „ํ™˜ ์ œ๋„ค๋ฆญ ๋ฌธ๋ฒ• ํ™œ์šฉ

- Media Project:

  • Onboarding ์ฝ”๋“œ๋ฒ ์ด์Šค๋กœ ์ž‘์„ฑ. (์Šคํ† ๋ฆฌ๋ณด๋“œ๋ฅผ ์‚ด๋ ค๋‘” ์ฑ„๋กœ ๋งŒ๋“ค๋ ค๋‹ˆ๊นŒ ์กฐ๊ธˆ ํ—ค๋งธ์ง€๋งŒ,,, )
  • ์ฃผ๋ณ€ ์˜ํ™”๊ด€ ํƒ์ƒ‰ ํŽ˜์ด์ง€ ์ถ”๊ฐ€

 

 

์ €์ž‘์žํ‘œ์‹œ

'๐ŸŒฑ SeSAC iOS 3๊ธฐ' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

๐ŸŒฑ ์ƒˆ์‹น ์˜๋“ฑํฌ iOS ์•ฑ๊ฐœ๋ฐœ์ž ๋ฐ๋ท”๊ณผ์ • 3๊ธฐ ํ›„๊ธฐ  (5) 2024.06.25
[SeSAC] iOS ๊ฐœ์ธ์•ฑ <์ง๊ด€๋กœ๊ทธ> ์ถœ์‹œ ํšŒ๊ณ   (10) 2023.10.24
๐ŸŒฑ 7์ฃผ์ฐจ: URLSession, Access Control, ARC  (4) 2023.09.04
๐ŸŒฑ 5์ฃผ์ฐจ: API ํ†ต์‹ , Codable, DispatchGroup, ๋ณต์Šต  (1) 2023.08.20
๐ŸŒฑ 4์ฃผ์ฐจ: ๋„คํŠธ์›Œํฌ ํ†ต์‹   (0) 2023.08.13
'๐ŸŒฑ SeSAC iOS 3๊ธฐ' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€
  • [SeSAC] iOS ๊ฐœ์ธ์•ฑ <์ง๊ด€๋กœ๊ทธ> ์ถœ์‹œ ํšŒ๊ณ 
  • ๐ŸŒฑ 7์ฃผ์ฐจ: URLSession, Access Control, ARC
  • ๐ŸŒฑ 5์ฃผ์ฐจ: API ํ†ต์‹ , Codable, DispatchGroup, ๋ณต์Šต
  • ๐ŸŒฑ 4์ฃผ์ฐจ: ๋„คํŠธ์›Œํฌ ํ†ต์‹ 
Callie_
Callie_
  • Callie_
    CalliOS
    Callie_
  • ์ „์ฒด
    ์˜ค๋Š˜
    ์–ด์ œ
    • ๋ถ„๋ฅ˜ ์ „์ฒด๋ณด๊ธฐ
      • ๐ŸŽ APPLE
      • ๐ŸŽ Dev
        • Swift
        • UIKit
        • SwiftUI
        • Issue
        • ๊ตฌํ˜„
      • ๐ŸŽ Design
        • HIG
      • โš™๏ธ CS
      • ๐Ÿ’ก ์•Œ๊ณ ๋ฆฌ์ฆ˜
        • ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค
        • ๋ฐฑ์ค€
      • ๐ŸŸ๏ธ ์ง๊ด€๋กœ๊ทธ (์ถœ์‹œ์•ฑ)
        • ์—…๋ฐ์ดํŠธ
      • ๐ŸŒฑ SeSAC iOS 3๊ธฐ
  • ๋ธ”๋กœ๊ทธ ๋ฉ”๋‰ด

    • ํ™ˆ
    • ํƒœ๊ทธ
  • ๋งํฌ

  • ๊ณต์ง€์‚ฌํ•ญ

  • ์ธ๊ธฐ ๊ธ€

  • ํƒœ๊ทธ

    Infoํƒญ
    TapGestureRecognizer
    Swift
    CustomView
    SwiftUI
    IBAction
    DidEndOnExit
    modalPresentStyle
    SeSAC
    .OverFullScreen
    DiffableDataSource
    cornerradius
    CocoaTouchFramework
    ํ™”๋ฉด์ „ํ™˜
    addTarget
    assets
    ๋„คํŠธ์›Œํฌํ†ต์‹ 
    stroyboard
    layer.shadow
    clipsToBound
    .fullScreen
    ios
    ์ƒ๋ช…์ฃผ๊ธฐ
    TableViewCell
    Entry Point
    IBOutlet
    diffable
    Enum
    Snapshot
    apply
  • ์ตœ๊ทผ ๋Œ“๊ธ€

  • ์ตœ๊ทผ ๊ธ€

  • hELLOยท Designed By์ •์ƒ์šฐ.v4.10.0
Callie_
๐ŸŒฑ 6์ฃผ์ฐจ: NotificationCenter, CLLocationManager, MKMapView, UIPageViewController
์ƒ๋‹จ์œผ๋กœ

ํ‹ฐ์Šคํ† ๋ฆฌํˆด๋ฐ”