Notice
Recent Posts
Recent Comments
Link
๊ด€๋ฆฌ ๋ฉ”๋‰ด

lgvv98

โŒจ๏ธ ch13 ํ‚ค๋ณด๋“œ์— ๋”ฐ๋ฅธ ๋ ˆ์ด์•„์›ƒ ์กฐ์ •ํ•˜๊ธฐ ๋ณธ๋ฌธ

โš ๏ธ deprecated โš ๏ธ/ํŒจ์บ (์˜ฌ์ธ์›)

โŒจ๏ธ ch13 ํ‚ค๋ณด๋“œ์— ๋”ฐ๋ฅธ ๋ ˆ์ด์•„์›ƒ ์กฐ์ •ํ•˜๊ธฐ

๐Ÿฅ• ์บ๋Ÿฟ๋งจ 2021. 6. 26. 14:46

โœ… ์ž ์ด๋ฒˆ์‹œ๊ฐ„์—๋Š” ํ‚ค๋ณด๋“œ์— ๋”ฐ๋ฅธ ๋ ˆ์ด์•„์›ƒ์„ ์กฐ์ •ํ•ด๋ณด๋Š” ์‹œ๊ฐ„์„ ๊ฐ€์ ธ๋ณด๋„๋ก ํ• ๊ฒŒ์š”.

์ด๋ฒˆ ํฌ์ŠคํŒ…๋ถ€ํ„ฐ๋Š”,,,! ๋…นํ™” ๊ธฐ๋Šฅ์„ ๋ฐœ๊ฒฌํ•ด์„œ ๋…นํ™”๊ธฐ๋Šฅ๋„ ๋„ฃ์–ด๋ณด๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค!

์•„์ง์€ ์•ˆ๋˜๊ฒ ๋„ค,,, ^_^

 

์•„๋ฌดํŠผ ํ‚ค๋ณด๋“œ์— ๋”ฐ๋ฅธ ๋ ˆ์ด์•„์›ƒ ์กฐ์ •์ด ์–ด๋–ค๊ฑด์ง€ ๊ทธ๋ฆผ์œผ๋กœ ๋ณด์ž

 

 

์ขŒ - ํ‚ค๋ณด๋“œ๊ฐ€ ์˜ฌ๋ผ์˜ค๊ธฐ ์ „, ์šฐ - ํ‚ค๋ณด๋“œ๊ฐ€ ์˜ฌ๋ผ์˜จ ํ›„

์ง€๊ธˆ ๋ณด๋Š” ์ด๋ฏธ์ง€์ฒ˜๋Ÿผ ํ…์ŠคํŠธ ํ•„๋“œ๊ฐ€ ํ‚ค๋ณด๋“œ์— ๋งž๊ฒŒ ์กฐ์ •๋˜์–ด์•ผ ์‚ฌ์šฉ์ž๊ฐ€ ์ž…๋ ฅํ•˜๋Š”๊ฒŒ ํŽธํ•˜๊ฒ ์ง€? ๋งŒ์•ฝ์— ์ด๊ฒŒ ์กฐ์ •๋˜์ง€ ์•Š๋Š”๋‹ค๋ฉด ํ‚ค๋ณด๋“œ์— ํ…์ŠคํŠธ ํ•„๋“œ๊ฐ€ ๊ฐ€๋ ค์ง€๋Š” ํ˜„์ƒ์ด ๋ฐœ์ƒํ• ๊ฑฐ์•ผ.

 

๊ทธ๋Ÿผ ์ด๊ฑธ ์–ด๋–ป๊ฒŒ ์กฐ์ •ํ•˜๋Š๋ƒ? 

 -> bottom์œผ๋กœ ๊ฑธ๋ฆฐ ๋ ˆ์ด์•„์›ƒ์„ ์กฐ์ •ํ•จ์œผ๋กœ์จ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ์–ด. ๊ทธ๋Ÿผ ๋‹ค์Œ์€ ์ฝ”๋“œ๋ฅผ ํ†ตํ•ด ์‚ฌ์šฉํ•˜๋Š” ๋ฒ•์„ ์•Œ์•„๋ณด๋„๋ก ํ• ๊นŒ?

 

(๋ชฉ์ฐจ)

1. ํ‚ค๋ณด๋“œ ์ƒํƒœ๋ฅผ ํ™•์ธํ•  ์˜ต์ €๋ฒ„ ์„ค์ •

2. ์…€๋ ‰ํ„ฐ์— ๊ตฌํ˜„๋˜ ๋ฉ”์†Œ๋“œ๋ฅผ ์•Œ์•„๋ณด์ž

3. ํ‚ค๋ณด๋“œ๊ฐ€ ๋‚ด๋ ค๊ฐ€๊ฒŒ ๋งŒ๋“œ๋Š” ์ œ์Šค์ฒ˜ ๋‹ฌ๊ธฐ

 

โœ… ํ‚ค๋ณด๋“œ ์ƒํƒœ๋ฅผ ํ™•์ธํ•  ์˜ต์ €๋ฒ„ ์„ค์ •

    override func viewDidLoad() {
        super.viewDidLoad()
        
        // TODO: ํ‚ค๋ณด๋“œ ๋””ํ…์…˜
        NotificationCenter.default.addObserver(self, selector: #selector(adjustInputView), name: UIResponder.keyboardWillShowNotification, object: nil) 
        // ํ‚ค๋ณด๋“œ๊ฐ€ ๋‚˜์˜ค๋Š”๊ฒŒ ๊ฐ์ง€ ๋˜๋ฉด์€ ์—๋“œ์ €์ŠคํŠธ ์ธํ’‹๋ทฐ๊ฐ€ ์‹คํ–‰๋ผ
        NotificationCenter.default.addObserver(self, selector: #selector(adjustInputView), name: UIResponder.keyboardWillHideNotification, object: nil) 
       	// ํ‚ค๋ณด๋“œ๊ฐ€ ๋“ค์–ด๊ฐ€๋Š”๊ฒŒ ๊ฐ์ง€ ๋˜๋ฉด!! self๋Š” ์ด ๋ทฐ์ปจํŠธ๋กค๋Ÿฌ์—์„œ ๊ฐ์ง€ํ•˜๊ฒ ๋‹ค.
	}

ํ‚ค๋ณด๋“œ๋ฅผ ๊ฐ์ง€ํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” NotificationCenter์— ์˜ต์ €๋ฒ„๋ฅผ ๋ถ€์ฐฉํ•˜์—ฌ ์–ด๋–ค ์ƒํƒœ์ธ์ง€ ํ™•์ธํ•˜๋ฉด ๋ผ.

๊ทธ์— ๋”ฐ๋ฅธ ์•ก์…˜์€ ์…€๋ ‰ํ„ฐ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ฒ˜๋ฆฌํ•  ๋กœ์ง์— ๋Œ€ํ•œ ๋ฉ”์†Œ๋“œ๋ฅผ ๊ฑด๋„ค์ค„ ์ˆ˜ ์žˆ์–ด.

 

โœ… ์…€๋ ‰ํ„ฐ์— ๊ตฌํ˜„๋˜ ๋ฉ”์†Œ๋“œ๋ฅผ ์•Œ์•„๋ณด์ž

   @objc private func adjustInputView(noti: Notification) {
        guard let userInfo = noti.userInfo else { return }
        // TODO: ํ‚ค๋ณด๋“œ ๋†’์ด์— ๋”ฐ๋ฅธ ์ธํ’‹๋ทฐ ์œ„์น˜ ๋ณ€๊ฒฝ
        guard let keyboardFrame = (userInfo[UIResponder.keyboardFrameEndUserInfoKey] as? NSValue)?.cgRectValue else { return }
        
        if noti.name == UIResponder.keyboardWillShowNotification {
            let adjustmentHeight = keyboardFrame.height - view.safeAreaInsets.bottom
            inputViewBottom.constant = adjustmentHeight
        } else {
            inputViewBottom.constant = 0
        }
        
        print("---> Keyboard End Frame: \(keyboardFrame)")
    }

์…€๋ ‰ํ„ฐ์—๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๊ตฌํ˜„๋˜์–ด ์žˆ์–ด.

๋…ธํ‹ฐํ”ผ์ผ€์ด์…˜์— ๋Œ€ํ•œ ์ •๋ณด๋Š” ์•„๋ž˜์— ์ฐธ๊ณ  ๋ถ€๋ถ„์— ๋”ฐ๋กœ ์ ์–ด๋‘์—ˆ์œผ๋‹ˆ, ๋ณด๊ธฐ๋กœํ•˜๊ณ , ์ฝ”๋“œ๋ฅผ ๋ณด๋ฉด userInfo๋Š” ์˜ต์ €๋ฒ„๋ฅผ ํ†ตํ•ด ๋ฐ›์•„์˜จ ์ •๋ณด๊ฐ€ ์žˆ๋Š”์ง€๋ฅผ ํ™•์ธํ•˜๋Š” ์ฝ”๋“œ์•ผ.

๋‹ค์Œ์œผ๋กœ๋Š” keyboardFrame์„ ์•Œ์•„๋ณด์ž. ์ด ๋ถ€๋ถ„์€ ๊ธฐ๊ธฐ๋ณ„ ํ‚ค๋ณด๋“œ ์‚ฌ์ด์ฆˆ๊ฐ€ ๋ชจ๋‘ ๋‹ค๋ฅด๊ฒ ์ง€? ๊ทธ์— ๋Œ€์‘ํ•˜๊ธฐ ์œ„ํ•ด์„œ ์ž‘์„ฑ๋˜๋Š” ํ•จ์ˆ˜์ธ๋ฐ, ์• ํ”Œ ๊ณต์‹ ๊ฐœ๋ฐœ๋ฌธ์„œ์— ๋”ฐ๋ฅด๋ฉด keyboardFrameEndUserInfoKey๋Š” ํ‚ค๋ณด๋“œ๊ฐ€ ๋‚˜ํƒ€๋‚˜๋Š” ์• ๋‹ˆ๋ฉ”์ด์…˜์ด ๋๋‚ ๋•Œ ํ”„๋ ˆ์ž„์„ ๊ฒ€์ƒ‰ํ•˜๋Š”๊ฑฐ์•ผ. 

๋‹ค์Œ์€ if-else๋ฌธ์ธ๋ฐ notificationCenter์—์„œ ์–ด๋–ค ์ด๋ฒคํŠธ๋ฅผ ๋ฐ›์•„์™”๋Š”์ง€ ๋ด์•ผ๊ฒ ์ง€?

if์—๋Š” ํ‚ค๋ณด๋“œ๊ฐ€ ๋‚˜ํƒ€๋‚ ๋•Œ์˜ ์•ก์…˜์ธ๋ฐ, ํ‚ค๋ณด๋“œ์˜ ๋†’์ด์—์„œ ๋ทฐ์˜ ์•„๋ž˜์ชฝ safeArea๋ฅผ ๋นผ์ฃผ๋Š” ์ฝ”๋“œ๋ฅผ ํ™•์ธํ•  ์ˆ˜ ์žˆ์–ด.

๊ทธ ์ด์œ ๋Š” iPhone์ด ๋…ธ์น˜๊ฐ€ ์žˆ๋Š” ํ•˜๋“œ์›จ์–ด๊ฐ€ ์ถœ์‹œ๋˜๋ฉด์„œ, ๋…ธ์น˜์— ์˜ํ•ด ๋ทฐ๊ฐ€ ์งค๋ ค ๋ณด์ผ ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์•ฝ๊ฐ„์˜ inset(๋งˆ์ง„, ์—ฌ๋ฐฑ)์„ ๋‘๋Š”๋ฐ, ์ด๊ฑธ ๋นผ์ค˜์•ผ ํ‚ค๋ณด๋“œ์— ์ •ํ™•ํ•˜๊ฒŒ ์ฐฉ ๋‹ฌ๋ผ๋ถ™์–ด!! 

๋ทฐ์˜ safe Area๊ฐ€ ์กด์žฌํ•˜๋Š” ๋ชจ์Šต

์œ„์˜ ๊ทธ๋ฆผ์„ ๋ณด๋ฉด ์ดํ•ด๊ฐ€ ๊ฐ€์ง€? 

๋‹ค์Œ์€ inputViewBottom์ธ๋ฐ, ์ด ๋ณ€์ˆ˜๋Š” ๋ ˆ์ด์•„์›ƒ์„ ๋ณ€์ˆ˜๋กœ ์žก์€๊ฑฐ์•ผ.

์ธํ’‹ ๋ทฐ๋ฅผ ๋ณ€์ˆ˜๋กœ ์žก์€ ๋ถ€๋ถ„ ใ…์Šคํ† ๋ฆฌ ๋ณด๋“œ์˜ ๋ ˆ์ด์•„์›ƒ์˜ ์กฐ๊ธˆ ๊ตต๊ฒŒ ํ‘œ์‹œ๋œ ๋ถ€๋ถ„์ด ์ด ๋ถ€๋ถ„์ด๋‹ค.

๋ ˆ์ด์•„์›ƒ์„ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์žก๋Š”๋ฐ, ์—ฌ๊ธฐ์„œ second item์— ์ ํ˜€์žˆ๋Š” View๋Š” ํ…์ŠคํŠธํ•„๋“œ์™€ ๋ฒ„ํŠผ 2๊ฐœ๋ฅผ ๋‹ด๊ณ  ์žˆ๋Š” ๋ทฐ์•ผ. 

โ—๏ธ์Šˆํผ๋ทฐ๊ฐ€ ์•„๋‹Œ๊ฒƒ์— ์ฃผ์˜

๊ทธ๋Ÿผ ๋‹ค์‹œ ์ฝ”๋“œ๋กœ ๋Œ์•„๊ฐ€์„œ inputViewBottom.constant๋ฅผ ์šฐ๋ฆฌ๊ฐ€ ์žก์€ ๊ฐ’์œผ๋กœ ๋ฐ”๊ฟ”์ฃผ๋ฉด? ์•„๋ž˜์ชฝ์ด ๋ถ• ๋œจ๊ฒŒ ๋˜๊ฒ ์ง€? ํ‚ค๋ณด๋“œ ์œ„์— ์œ„์น˜ํ•˜๋Š” ํšจ๊ณผ๋ฅผ ๋ณผ ์ˆ˜ ์žˆ์–ด!!

๊ทธ๋ฆฌ๊ณ  ํ‚ค๋ณด๋“œ๊ฐ€ ๋‚ด๋ ค๊ฐ„๋‹ค๋ฉด, ์ž์—ฐ์Šค๋Ÿฝ๊ฒŒ ์ด ๊ฐ’์„ 0์œผ๋กœ ์„ธํŒ…ํ•ด์ฃผ๋ฉด ๋‹ค์‹œ ์›๋ž˜ ์ž๋ฆฌ๋ฅผ ์ฐพ์•„๊ฐˆ๊ฑฐ์•ผ!!

 

 

โœ… ํ‚ค๋ณด๋“œ๊ฐ€ ๋‚ด๋ ค๊ฐ€๊ฒŒ ๋งŒ๋“œ๋Š” ์ œ์Šค์ฒ˜ ๋‹ฌ๊ธฐ

ํ‚ค๋ณด๋“œ๋ฅผ ์˜ฌ๋ ธ์œผ๋‹ˆ๊นŒ, ์ด์ œ ๋‚ด๋ ค์•ผ๊ฒ ์ง€? ๋‚ด๋ฆฌ๋Š” ๋ฐฉ๋ฒ•์€ ์šฐ๋ฆฌ๋Š” ๋ณดํ†ต ํ‚ค๋ณด๋“œ ์ด์™ธ์— ์—ฌ๋ฐฑ์„ ํด๋ฆญํ•˜๋ฉด ํ‚ค๋ณด๋“œ๊ฐ€ ๋‚ด๋ ค๊ฐ€๊ธธ ๋ฐ”๋ผ์ž–์•„? ๊ทธ๋ ‡๊ฒŒ ๊ตฌํ˜„ํ•ด๋ณด๋„๋ก ํ• ๊ฒŒ.

ํƒญ ์ œ์Šค์ณ ๋‹ค๋Š” ๋ฐฉ๋ฒ•

ํƒญ ์ œ์Šค์ณ๋ฅผ ์šฐ์„  ๋‹ฌ์•„์•ผํ•˜๋Š”๋ฐ, ๊ฒ€์ƒ‰ํ•ด์„œ ๋‹ฌ๋ฉด ๋ผ.

UIView(์Šˆํผ๋ทฐ) ์ชฝ์—๋‹ค๊ฐ€ ๋‹ค๋Š”๋ฐ, ๊ทธ๋ž˜์•ผ์ง€๋งŒ ๋ทฐ ํ„ฐ์น˜ํ–ˆ์„๋•Œ, ๋น ์ ธ๋‚˜์˜ฌ ์ˆ˜ ์žˆ๋‹ค. 

โ—๏ธ์ด๋ฒˆ์—๋Š” ํ…์ŠคํŠธ ํฌํ•จํ•˜๋Š” ๋ทฐ ์•„๋‹ˆ๋‹ˆ๊นŒ ์ฃผ์˜

์ œ์Šค์ณ๋ฅผ ์žฅ์ฐฉํ•˜๊ฒŒ ๋˜๋ฉด ๋„์ปค์— ์„ธ๋ฒˆ์งธ์— ์ œ์Šค์ณ๊ฐ€ ์žฅ์ฐฉ๋œ ๋ชจ์Šต๋„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์–ด.

 

์—ฌ๊ธฐ์„œ ์กฐ๊ธˆ ์ฃผ๋ชฉํ• ๋งŒํ•œ ์ ์€ ์ œ์Šค์ณ๋„ IBAction์œผ๋กœ ์„ค์ •ํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ์ ์ด์•ผ ๊ทธ๋Ÿผ  ์ฝ”๋“œ๋ฅผ ํ•œ๋ฒˆ ๋ณผ๊นŒ?

    // TODO: BG ํƒญํ–ˆ์„๋•Œ, ํ‚ค๋ณด๋“œ ๋‚ด๋ ค์˜ค๊ฒŒ ํ•˜๊ธฐ
    @IBAction func tapBG(_ sender: Any) {
        inputTextField.resignFirstResponder()
    }

 

์ œ์Šค์ณ๋ฅผ IBAction์„ ํ†ตํ•ด ์—ฐ๊ฒฐํ•œ ์ฝ”๋“œ์ธ๋ฐ, ์ด ์ฝ”๋“œ์˜ ์˜๋ฏธ๋Š” ์• ํ”Œ ๊ฐœ๋ฐœ์ž ๊ณต์‹ ๋ฌธ์„œ์— ๋”ฐ๋ฅด๋ฉด resignFirstResponder()์˜ ๊ฒฝ์šฐ "์ฒซ๋ฒˆ์งธ ์‘๋‹ต์ž๋กœ์จ์˜ ์ƒํƒœ๋ฅผ ํฌ๊ธฐํ•˜๋ผ๋Š” ์š”์ฒญ์„ ๋ฐ›์•˜๋‹ค" ๋ผ๋Š” ์˜๋ฏธ์•ผ 

์ฆ‰, ์ œ์Šค์ณ๊ฐ€ ๋“ฑ๋ก๋œ ๋ทฐ ํ„ฐ์น˜์‹œ ํ‚ค๋ณด๋“œ๊ฐ€ ์˜ฌ๋ผ์˜ค๋Š” ํ…์ŠคํŠธ ํ•„๋“œ์˜ ์ƒํƒœ๋ฅผ ํฌ๊ธฐํ•˜๋ผ๋Š” ์˜๋ฏธ๋กœ, ํฌ์ปค์‹ฑ์„ ํ…์ŠคํŠธ ํ•„๋“œ์—์„œ ๋บด๊ฒŒ ๋ผ

 

 

๊ทธ๋Ÿผ ์ด๊ฒƒ์œผ๋กœ ๋งˆ์น˜๋„๋ก ํ•˜์ž

 

 

 

- ์ฐธ๊ณ  

https://k-elon.tistory.com/33

 

[iOS] NotificationCenter ํ†บ์•„๋ณด๊ธฐ

iOS ํ™˜๊ฒฝ์—์„œ ๋ฐฑ๊ทธ๋ผ์šด ์ž‘์—…์˜ ๊ฒฐ๊ณผ, ๋น„๋™๊ธฐ ์ž‘์—…์˜ ๊ฒฐ๊ณผ ๋“ฑ ํ˜„์žฌ ์ž‘์—…์˜ ํ๋ฆ„๊ณผ ๋‹ค๋ฅธ ํ๋ฆ„์˜ ์ž‘์—…์œผ๋กœ๋ถ€ํ„ฐ ์ด๋ฒคํŠธ๋ฅผ ๋ฐ›์œผ๋ ค๊ณ  ํ•  ๋•Œ Notification์„ ๋งŽ์ด ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค๋ฉด, ๋Œ€์šฉ๋Ÿ‰ ํŒŒ์ผ์„ ๋‹ค

k-elon.tistory.com

https://developer.apple.com/documentation/uikit/uikeyboardframeenduserinfokey

 

Apple Developer Documentation

 

developer.apple.com

 

https://developer.apple.com/documentation/uikit/uiresponder/1621097-resignfirstresponder

 

Apple Developer Documentation

 

developer.apple.com

 

Comments