** ๊ณต๋ถ ์ค์ด๋ผ ํ๋ฆด ์ ์์ **
ํค๋ณด๋ ๋๋ฌธ์ ํ๋ฉด์ด ๊ฐ๋ ค์ง๋ค๋ฉด ... ๊ณค๋ํ์ฃ
ํ์ ๋ค๋ฅธ ์๋ฎฌ๋ ์ดํฐ๋ก ํ ์คํธํด๋ณผ ๋๋ ๋ฉ์ฉกํ๋๋ฐ, ๋ง์ง๋ง ๊ฒํ ๋ ์์ดํ์ผ๋ก ๋ด๋ณด๋๊น ์๋ง์ธ ๊ฒ์ด๋ค.
ํค๋ณด๋๊ฐ ๊ฐ๋ ค์ ธ์ ๋ด๋ ค๊ฐ์ง๋ ์๊ณ ... ๊ทธ๋ฅ ๋๋์ผ๋ก ์ด๋ฉ์ผ ์น๋ ๊ฒ์ด๋ค. ใ ใ ใ
ํด๊ฒฐ ๋ฐฉ๋ฒ
ํค๋ณด๋๊ฐ ๋ํ๋๊ณ ์ฌ๋ผ์ง ๋๋ฅผ ๊ฐ์ง -> ์ํ๋ ๋งํผ ๋ทฐ๋ฅผ ์ฌ๋ฆฌ๊ณ ๋ด๋ฆผ
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
}
}
๋. ์ฌ์ค ๋๊ฒ ๊ฐ๋จํ ์ค ์์๋๋ฐ ์ฝ๋ ์์ฒญ ๋ง์ด ์ง์ผ๋ผ์ ๋๋๋ค.
๋ญ ํ๋ ์ฌ์ด๊ฒ ์๊ตฌ๋~ ์์ดํ ์ฌ๋ผ์ ธ
์๋ฃ ํ๋ฉด
์ด์ง์ฟต ์ฌ๋ ค์ฃผ๊ณ ๋ด๋ ค์ค๋ค.
'๐ iOS' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
Share Extension (0) | 2022.10.03 |
---|---|
์ฑ์ ๋ผ์ดํธ๋ชจ๋๋ง ์ง์ํ๊ฒ ๋ง๋ ๋ค. (0) | 2022.10.03 |
์ค๋ต๋ฐ ๋ง๋ค๊ธฐ (์ ๋๋ฉ์ด์ ์ผ๋ก ์์น ์ด๋) (0) | 2022.09.23 |
[RxSwift] bind, drive (0) | 2022.09.07 |
[iOS] MVVM Pattern ์์ํ๊ฒ ์ ์ฉ (0) | 2022.09.07 |