[iOS] ํค๋ณด๋๊ฐ ํ ์คํธํ๋๋ฅผ ๊ฐ๋ฆด๋ ํด๊ฒฐ๋ฒ(When the keyboard covers text field)
์๋ ํ์ธ์ Foma ๐ ์ ๋๋ค!
์ค๋์ ํ ์คํธํ๋๋ฅผ ๋ง๋ค๋ค๋ณด๋ฉด ์ ๋ง ์์ฃผ ๋ง๋๋ ํค๋ณด๋ ๋ฌธ์ ์ ๋ํด์ ๋ค๋ค๋ณด๋ ค๊ณ ํด์.
์๋ฎฌ๋ ์ดํฐ๋ก ๊ฐ๋ฐํ๋ค๋ณด๋ฉด ํค๋ณด๋์ ์์น๋ฅผ ๊ณ ๋ คํ์ง ์๊ณ ์ง๋ค๊ฐ ํค๋ณด๋๊ฐ ์ฌ๋ผ์ค๋ ์๊ฐ
ํค๋ณด๋ ์๋์ ์๋ ํ ์คํธํ๋๋ ๋ฒํผ๋ค์ด ๊ฐ๋ ค์ง๊ณค ํ๋๋ฐ์.
์ค๋์ ์ด๊ฒ์ ๋ํ ํด๊ฒฐ๋ฒ์ ์ ๋ฆฌํ๋๋ก ํ๊ฒ ์ต๋๋ค.
๋ฐ๋ก ์์ํ ๊ฒ์!
Preview
Storyboard
์๋ ํ๋ฉด๊ณผ ๊ฐ์ด ํ ์คํธํ๋์ ๋ฒํผ์ด ๋น๊ต์ ์๋์ ์๋๋ก ๋ง๋ค์ด ์ฃผ๊ฒ ์ต๋๋ค.
View์๋ Tap Gesture Recognizer๋ฅผ ๋ฌ์๋๊ฒ ์ต๋๋ค.
ViewController
์คํ ๋ฆฌ๋ณด๋์์ ๋ง๋ค์ด์ค ํ ์คํธํ๋์ ๋ฒํผ์ ์ฐ๊ฒฐํด์ค๋๋ค.
@IBOutlet weak var textField: UITextField!
@IBOutlet weak var button: UIButton!
Tap Gesture Recognizer๋ ์ฐ๊ฒฐ์์ผ์ฃผ์ด ๋ทฐ๋ฅผ ํญํ์ ๋ ํค๋ณด๋๊ฐ ๋ด๋ ค๊ฐ๋๋ก ์ค์ ํด์ค๋๋ค.
@IBAction func tapBackgroundView(_ sender: Any) {
view.endEditing(true)
}
๊ทธ๋ฆฌ๊ณ ์คํ์ ์์ผ์ ํค๋ณด๋๋ฅผ ์ฌ๋ ค๋ณด๋ฉด (cmd + k๋ฅผ ๋๋ฅด๋ฉด ๋ฉ๋๋ค.)
์๋์ ๊ฐ์ด ํ๋ฉด์ ๋ฎ์ฃ ?
ํด๊ฒฐ๋ฒ
์ ๊ฐ ์๊ฐํ ํด๊ฒฐ๋ฒ์ ์๋์ ๊ฐ์ต๋๋ค.
1. ํค๋ณด๋๊ฐ ์ฌ์ฉ๋ ๋๋ฅผ ๊ฐ์งํ๋ค
2. ํค๋ณด๋ ๋์ด๋ฅผ ์ธก์ ํ๋ค.
3. ํค๋ณด๋ ๋์ด๋งํผ ๋ทฐ์ y๋ฅผ ์ฌ๋ ค์ค๋ค.
4. ํค๋ณด๋๊ฐ ๋ด๋ ค๊ฐ ๋๋ฅผ ๊ฐ์งํ๋ค.
5. ํค๋ณด๋ ๋์ด๋งํผ ๋ทฐ์ y๋ฅผ ๋ด๋ ค์ค๋ค.
1. ํค๋ณด๋๊ฐ ์ฌ์ฉ๋ ๋๋ฅผ ๊ฐ์งํ๋ค
UIViewController + Extension.swift
๋ชจ๋ ๋ทฐ์ปจํธ๋กค๋ฌ์ ์ ์ฉํ๊ธฐ ์ํด์ UIViewController + Extension.swift๋ฅผ ๋ง๋ค์ด์ฃผ์์ต๋๋ค.
์๋์ ๊ฐ์ด ํค๋ณด๋ ์ต์ ๋ฒ๋ฅผ ์ธํ ํ๋ ๋ฉ์๋๋ฅผ ๋ง๋ค์ด์ค๋๋ค.
NotificationCenter์ UIResponder๋ฅผ ํ์ฉํด์ ํค๋ณด๋๊ฐ ์ฌ๋ผ์ฌ ๋๋ฅผ ๊ฐ์งํ ์ ์๋๋ก ํฉ๋๋ค.
import UIKit
extension UIViewController {
func setKeyboardObserver() {
NotificationCenter.default.addObserver(self, selector: #selector(UIViewController.keyboardWillShow), name: UIResponder.keyboardWillShowNotification, object: nil)
}
}
2. ํค๋ณด๋ ๋์ด๋ฅผ ์ธก์ ํ๋ค.
์๋์ ๊ฐ์ด ํค๋ณด๋๊ฐ ๋ณด์ผ๋ ํค๋ณด๋์ ๋์ด๋ฅผ ๊ณ์ฐํด์ค๋๋ค.
@objc func keyboardWillShow(notification: NSNotification) {
if let keyboardFrame: NSValue = notification.userInfo?[UIResponder.keyboardFrameEndUserInfoKey] as? NSValue {
let keyboardRectangle = keyboardFrame.cgRectValue
let keyboardHeight = keyboardRectangle.height
}
}
3. ํค๋ณด๋ ๋์ด๋งํผ ๋ทฐ์ y๋ฅผ ์ฌ๋ ค์ค๋ค.
์๋์ ๊ฐ์ด ํ์ฌ ๋ทฐ์ origin.y์ ํค๋ณด๋ ๋์ด๋งํผ ๋นผ์ค๋๋ค.
@objc func keyboardWillShow(notification: NSNotification) {
if let keyboardFrame: NSValue = notification.userInfo?[UIResponder.keyboardFrameEndUserInfoKey] as? NSValue {
let keyboardRectangle = keyboardFrame.cgRectValue
let keyboardHeight = keyboardRectangle.height
UIView.animate(withDuration: 1) {
self.view.window?.frame.origin.y -= keyboardHeight
}
}
}
4. ํค๋ณด๋๊ฐ ๋ด๋ ค๊ฐ ๋๋ฅผ ๊ฐ์งํ๋ค.
setKeyboardObserver์ ์๋์ ๊ฐ์ด ๋ด๋ ค๊ฐ ๋๋ฅผ ๊ฐ์งํ๋ ์ฝ๋๋ฅผ ์ถ๊ฐํด์ค๋๋ค.
func setKeyboardNotification() {
NotificationCenter.default.addObserver(self, selector: #selector(UIViewController.keyboardWillShow), name: UIResponder.keyboardWillShowNotification, object: nil)
NotificationCenter.default.addObserver(self, selector: #selector(UIViewController.keyboardWillHide), name: UIResponder.keyboardWillHideNotification, object:nil)
}
5. ํค๋ณด๋์ ๋์ด๋งํผ y๋ฅผ ๋ด๋ ค์ค๋ค.
ํค๋ณด๋๋ฅผ ๋ํ ๋์ ๋ง์ฐฌ๊ฐ์ง๋ก ๋์ด๋ฅผ ๊ตฌํด์ ํ์ฌ ๋ทฐ์ origin.y์ ํค๋ณด๋ ๋์ด๋งํผ์ ๋ํด์ค๋๋ค.
@objc func keyboardWillHide(notification: NSNotification) {
if self.view.window?.frame.origin.y != 0 {
if let keyboardFrame: NSValue = notification.userInfo?[UIResponder.keyboardFrameEndUserInfoKey] as? NSValue {
let keyboardRectangle = keyboardFrame.cgRectValue
let keyboardHeight = keyboardRectangle.height
UIView.animate(withDuration: 1) {
self.view.window?.frame.origin.y += keyboardHeight
}
}
}
}
ViewController
๋ทฐ์ปจํธ๋กค๋ฌ์ ํค๋ณด๋ ์ต์ ๋ฒ๋ฅผ ์ธํ ํด์ ์คํํด๋ณด๋ฉด
import UIKit
class ViewController: UIViewController {
@IBOutlet weak var textField: UITextField!
@IBOutlet weak var button: UIButton!
override func viewDidLoad() {
setKeyboardObserver()
}
@IBAction func tapBackgroundView(_ sender: Any) {
view.endEditing(true)
}
}
์๋์ ๊ฐ์ด ํค๋ณด๋๊ฐ ์ฌ๋ผ์ฌ ๋ ๋ทฐ๊ฐ ๊ทธ๋งํผ ์ฌ๋ผ๊ฐ๊ณ ๋ด๋ ค๊ฐ ๋ ๊ทธ๋งํผ ๋ด๋ ค๊ฐ๊ฒ ๋ฉ๋๋ค!
Source Code
์ค๋์ ๊ฐ๋จํ๊ฒ ํค๋ณด๋๊ฐ ํ
์คํธํ๋๋ ๋ค๋ฅธ ๊ฒ๋ค์ ๋ฎ์ด๋ฒ๋ฆด ๋์ ๋ฌธ์ ์ ์ ํด๊ฒฐํด๋ณด์์ต๋๋ค!
ํน์๋ผ๋ ๋์์ด ๋์ จ๊ฑฐ๋ ๊ถ๊ธํ์ ์ ์ด ์์ผ๋ฉด ์ธ์ ๋ ๋๊ธ๋ก ๋ฌ์์ฃผ์ธ์!