๐ŸŽ iOS

ํ‚ค๋ณด๋“œ ๋•Œ๋ฌธ์— ํ™”๋ฉด ๊ฐ€๋ ค์งˆ ๋•Œ

gom1n 2022. 10. 3. 08:15

** ๊ณต๋ถ€ ์ค‘์ด๋ผ ํ‹€๋ฆด ์ˆ˜ ์žˆ์Œ **

 

ํ‚ค๋ณด๋“œ ๋•Œ๋ฌธ์— ํ™”๋ฉด์ด ๊ฐ€๋ ค์ง„๋‹ค๋ฉด ... ๊ณค๋ž€ํ•˜์ฃ 

ํ‰์†Œ ๋‹ค๋ฅธ ์‹œ๋ฎฌ๋ ˆ์ดํ„ฐ๋กœ ํ…Œ์ŠคํŠธํ•ด๋ณผ ๋•Œ๋Š” ๋ฉ€์ฉกํ–ˆ๋Š”๋ฐ, ๋งˆ์ง€๋ง‰ ๊ฒ€ํ†  ๋•Œ ์•„์ดํŒŸ์œผ๋กœ ๋ด๋ณด๋‹ˆ๊นŒ ์—‰๋ง์ธ ๊ฒƒ์ด๋‹ค.

ํ‚ค๋ณด๋“œ๊ฐ€ ๊ฐ€๋ ค์ ธ์„œ ๋‚ด๋ ค๊ฐ€์ง€๋„ ์•Š๊ณ  ... ๊ทธ๋ƒฅ ๋А๋‚Œ์œผ๋กœ ์ด๋ฉ”์ผ ์น˜๋Š” ๊ฒƒ์ด๋‹ค. ใ…‹ใ…‹ใ…‹

์˜ค๋ฅธ์ชฝ์ด ์•„์ดํŒŸ

 

ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•

ํ‚ค๋ณด๋“œ๊ฐ€ ๋‚˜ํƒ€๋‚˜๊ณ  ์‚ฌ๋ผ์งˆ ๋•Œ๋ฅผ ๊ฐ์ง€ -> ์›ํ•˜๋Š” ๋งŒํผ ๋ทฐ๋ฅผ ์˜ฌ๋ฆฌ๊ณ  ๋‚ด๋ฆผ

 

Notification Center

ํ‚ค๋ณด๋“œ๊ฐ€ ๋‚˜ํƒ€๋‚˜๊ณ  ์‚ฌ๋ผ์งˆ ๋•Œ๋ฅผ ๊ฐ์ง€ํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” Notification Center๋ฅผ ์“ฐ๋ฉด ๋œ๋‹ค.

๋“ฑ๋ก์ด ๋œ ์˜ต์ €๋ฒ„๋“ค์—๊ฒŒ ์ •๋ณด๋ฅผ ๋ธŒ๋กœ๋“œ์บ์ŠคํŒ…ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•ด์ฃผ๋Š” ์•Œ๋ฆผ ๋ฐœ์†ก ๋ฉ”์ปค๋‹ˆ์ฆ˜์ด๋‹ค.

Notification ์˜ ๊ฐœ์š”๋ฅผ ๋ณด๋ฉด, addObserver๋ฅผ ํ†ตํ•ด ์•Œ๋ฆผ ๊ฐ์ฒด๋ฅผ ๋ฐ›์„ ์ˆ˜ ์žˆ๊ณ , ์ž์‹ ์€ ๊ด€์ฐฐ์ž๋กœ์จ ์ถ”๊ฐ€๋œ๋‹ค.

์ด๋ฒˆ ๊ฐ™์€ ๊ฒฝ์šฐ๋Š”, ํ‚ค๋ณด๋“œ๊ฐ€ ์˜ฌ๋ผ์˜ค๊ณ  ์‚ฌ๋ผ์งˆ ๋•Œ๋ฅผ ๊ด€์ฐฐํ•˜๊ณ  ์•Œ๋ฆผ ๋ฐ›์„ ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค.

 

๊ทธ๋ฆฌ๊ณ  ์˜ค๋Š˜ ์‚ฌ์šฉํ•˜๊ณ ์ž ํ•˜๋Š” ์•Œ๋ฆผ์„ผํ„ฐ(notification center)๋Š” ๊ธฐ๋ณธ(Default)์ด๊ณ ,

๋งŒ์•ฝ ๋‹ค๋ฅธ ํ”„๋กœ์„ธ์Šค์— ๋Œ€ํ•œ ์•Œ๋ฆผ์„ ๋ฐ›๊ณ ์ž ํ•œ๋‹ค๋ฉด ๋””ํดํŠธ๊ฐ€ ์•„๋‹Œ DistributedNotificationCenter๋ฅผ ์‚ฌ์šฉํ•˜๋ผ๊ณ  ํ•œ๋‹ค.

 

์™œ ๋””ํดํŠธ์ธ๊ฐ€?

์ธ์Šคํ„ด์Šค์˜ ์ƒ์„ฑ์ด ํ•˜๋‚˜๋กœ ์ •ํ•ด์ ธ ์žˆ๋‹ค. ๋‹ค์‹œ ๋งํ•ด '์‹ฑ๊ธ€ํ†ค (Singleton)' ํŒจํ„ด์ด๋ผ๋Š” ๊ฒƒ.

 

์™œ ์‹ฑ๊ธ€ํ†ค์ธ๊ฐ€?

์ƒ๊ฐํ•ด๋ณด๋ฉด ๋‹น์—ฐํ•˜๋‹ค. ์—ฌ๊ธฐ์ €๊ธฐ์„œ ์•Œ๋ฆผ์„ ๋ฐ›์œผ๋ฉด ํ”Œ์  ํฌ๊ธฐ๊ฐ€ ๋„ˆ๋ฌด ์ปค์ง€๊ณ , ์•Œ๋ฆผ๊ฐ์ฒด๋ฅผ ๊ด€๋ฆฌํ•˜๊ธฐ๋„ ์‰ฝ์ง€ ์•Š์„ ๊ฒƒ์ด๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

๋”ฐ๋ผ์„œ ๋ทฐ๊ฐ€ ์ƒ๊ธฐ๊ณ  ์‚ฌ๋ผ์งˆ ๋•Œ addObserver / removeObserver ๋ฅผ ํ•ด์ฃผ๋ฉด ๋  ๊ฒƒ ๊ฐ™๋‹ค.

removeObserver๋Š” ๋ฐ˜๋“œ์‹œ ํ•„์š”ํ•˜๋‹ค. addObserver๋ฅผ ํ•˜๊ณ  remove๋ฅผ ํ•ด์ฃผ์ง€ ์•Š๋Š”๋‹ค๋ฉด ๋ฉ”๋ชจ๋ฆฌ ๋‚ญ๋น„๋กœ ์ด์–ด์งˆ ์ˆ˜ ์žˆ๋‹ค.

 

ํ•ด๊ฒฐ ๊ณผ์ • & ์ฝ”๋“œ

1) ๋ทฐ๊ฐ€ ์ƒ๊ธฐ๊ณ  ์‚ฌ๋ผ์งˆ ๋•Œ addObserver / removeObserver

override func viewWillAppear(_ animated: Bool) {
    self.addKeyboardNotifications()
}
override func viewDidAppear(_ animated: Bool) {
    if let textfield = self.textfield {self.textfield.becomeFirstResponder()}
}
override func viewWillDisappear(_ animated: Bool) {
    if let textfield = self.textfield {self.removeKeyboardNotifications()}
}
func addKeyboardNotifications() {
    // ํ‚ค๋ณด๋“œ๊ฐ€ ๋‚˜ํƒ€๋‚  ๋•Œ ์•ฑ์—๊ฒŒ ์•Œ๋ฆฌ๋Š” ๋ฉ”์„œ๋“œ ์ถ”๊ฐ€
    NotificationCenter.default.addObserver(self, selector: #selector(self.keyboardWillAppear(noti:)), name: UIResponder.keyboardWillShowNotification , object: nil)
    // ํ‚ค๋ณด๋“œ๊ฐ€ ์‚ฌ๋ผ์งˆ ๋•Œ ์•ฑ์—๊ฒŒ ์•Œ๋ฆฌ๋Š” ๋ฉ”์„œ๋“œ ์ถ”๊ฐ€
    NotificationCenter.default.addObserver(self, selector: #selector(self.keyboardWillDisappear(noti:)), name: UIResponder.keyboardWillHideNotification, object: nil)
}
func removeKeyboardNotifications() {
    // ํ‚ค๋ณด๋“œ๊ฐ€ ๋‚˜ํƒ€๋‚  ๋•Œ ์•ฑ์—๊ฒŒ ์•Œ๋ฆฌ๋Š” ๋ฉ”์„œ๋“œ ์ œ๊ฑฐ
    NotificationCenter.default.removeObserver(self, name: UIResponder.keyboardWillShowNotification , object: nil)
    // ํ‚ค๋ณด๋“œ๊ฐ€ ์‚ฌ๋ผ์งˆ ๋•Œ ์•ฑ์—๊ฒŒ ์•Œ๋ฆฌ๋Š” ๋ฉ”์„œ๋“œ ์ œ๊ฑฐ
    NotificationCenter.default.removeObserver(self, name: UIResponder.keyboardWillHideNotification, object: nil)
}

 

2) ํ‚ค๋ณด๋“œ๊ฐ€ ์˜ฌ๋ผ์˜ค๊ณ  ๋‚ด๋ ค๊ฐˆ ๋•Œ ํ˜ธ์ถœ๋˜๋Š” ํ•จ์ˆ˜ ์ •์˜

 

์„ค๋ช…) ํ‚ค๋ณด๋“œ๊ฐ€ ์˜ฌ๋ผ์™”์„ ๋•Œ ํ‚ค๋ณด๋“œ์˜ ๋†’์ด๋ฅผ ๊ตฌํ•œ๋‹ค. (keyboardHeight)

๋‚˜๋Š” ํ™”๋ฉด ์ „์ฒด๋ฅผ ์˜ฌ๋ ค๋ฒ„๋ฆฌ๋Š” ๊ฒƒ์ด ์•„๋‹Œ, ๊ฐ€๋ ค์ง€๋Š” ๋ถ€๋ถ„๋งŒํผ์˜ ํ™”๋ฉด๋งŒ ์‚ด์ง์ฟต ์˜ฌ๋ ค์ฃผ๊ณ  ์‹ถ๊ธฐ ๋•Œ๋ฌธ์—...

keyboard์˜ Y์ขŒํ‘œ์™€ ํ…์ŠคํŠธํ•„๋“œ์˜ Y์ขŒํ‘œ๋ฅผ ๊ตฌํ•ด, ๋งŒ์•ฝ ํ‚ค๋ณด๋“œ๊ฐ€ ํ…์ŠคํŠธํ•„๋“œ๋ณด๋‹ค ์œ„์— ์žˆ๋‹ค๋ฉด ํ™”๋ฉด์„ ์‚ด์ง์ฟต(self.buttonHeight๋งŒํผ) ์˜ฌ๋ ค์ฃผ๋Š” ๊ฒƒ์ด๋‹ค. 

์—ฌ๊ธฐ์„œ self.buttonHeight๋Š” ๋ฒ„ํŠผ์˜ ๋†’์ด๋ฅผ ๋‚ด๊ฐ€ ์ง€์ •ํ•ด์ค€ ๊ฒƒ์ด๋‹ค.

์™œ๋ƒ๋ฉด ๋‚˜์˜ ์™„๋ฃŒ๋ฒ„ํŠผ์€ ํ‚ค๋ณด๋“œ ์œ„์— ๋”ฑ ๋ถ™์–ด์žˆ๊ฒŒ ์„ค๊ณ„ํ–ˆ๊ธฐ ๋•Œ๋ฌธ์—... 

๋˜๊ฒŒ ์•ผ๋งค๊ฐ™๋„ค.. ์ข‹์€ ๋ฐฉ๋ฒ• ์•„๋Š” ์‚ฌ๋žŒ ์žˆ์œผ๋ฉด ์•Œ๋ ค์ค˜์š”

@objc func keyboardWillAppear(noti: NSNotification) {
    if let keyboardFrame: NSValue = noti.userInfo?[UIResponder.keyboardFrameEndUserInfoKey] as? NSValue {
        let keyboardRectangle = keyboardFrame.cgRectValue
        let keyboardHeight = keyboardRectangle.height
        let keyboardY = self.view.frame.height - keyboardHeight
        if keyboardY - self.buttonHeight < self.textfieldY {
            self.view.bounds.origin.y +=  self.buttonHeight
        }
    }
}

@objc func keyboardWillDisappear(noti: NSNotification) {
    if self.view.bounds.origin.y != restoreFrameValue {
        if let keyboardFrame: NSValue = noti.userInfo?[UIResponder.keyboardFrameEndUserInfoKey] as? NSValue {
            let keyboardRectangle = keyboardFrame.cgRectValue
            let keyboardHeight = keyboardRectangle.height
            let keyboardY = self.view.frame.height - keyboardHeight
            if keyboardY - self.buttonHeight < self.textfieldY {
                self.view.bounds.origin.y -=  self.buttonHeight
            }
        }
    }
}

 

3) ํ…์ŠคํŠธํ•„๋“œ Delegate

์ด๊ฑด ํ•ด๋„ ๋˜๊ณ  ์•ˆํ•ด๋„ ๋˜๋Š”๋ฐ, TextField๋ฅผ delegateํ•ด์ค€๋‹ค.

3-1) ๋นˆ ํ™”๋ฉด ํ„ฐ์น˜ ์‹œ ํ‚ค๋ณด๋“œ ๋‚ด๋ ค๊ฐ

3-2) ํ…์ŠคํŠธํ•„๋“œ ํ„ฐ์น˜ ์‹œ ํ‚ค๋ณด๋“œ ๋‹ค์‹œ ์˜ฌ๋ผ๊ฐ

3-3) ํ…์ŠคํŠธํ•„๋“œ ์ž‘์„ฑ ์™„๋ฃŒ ์‹œ (ํ‚ค๋ณด๋“œ์—์„œ Returnํ‚ค ๋ˆŒ๋ €์„ ์‹œ) ํ‚ค๋ณด๋“œ ๋‚ด๋ ค๊ฐ

extension KeyboardViewController: UITextFieldDelegate {
	override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
        self.view.endEditing(true)
    }
    func textFieldShouldReturn(_ textField: UITextField) -> Bool {
        textField.resignFirstResponder()
        return true
    }

    func textFieldShouldEndEditing(_ textField: UITextField) -> Bool {
        self.view.bounds.origin.y = self.restoreFrameValue
        return true
    }
}

 

 

๋. ์‚ฌ์‹ค ๋˜๊ฒŒ ๊ฐ„๋‹จํ•  ์ค„ ์•Œ์•˜๋Š”๋ฐ ์ฝ”๋“œ ์—„์ฒญ ๋งŽ์ด ์งœ์•ผ๋ผ์„œ ๋†€๋ž๋‹ค. 

๋ญ ํ•˜๋‚˜ ์‰ฌ์šด๊ฒŒ ์—†๊ตฌ๋‚˜~ ์•„์ดํŒŸ ์‚ฌ๋ผ์ ธ

์™„๋ฃŒ ํ™”๋ฉด 

์‚ด์ง์ฟต ์˜ฌ๋ ค์ฃผ๊ณ  ๋‚ด๋ ค์ค€๋‹ค.