[iOS] - Keyboard dismiss, 바깥을 터치하거나 Return 키를 눌러 키보드 해제하기
키보드가 화면에 올라와 있는 상태에서 바깥을 터치하거나 <kbd>return</kbd> 키를 눌러 키보드를 해제하는 방법을 알아보자.
1. 키보드 바깥을 터치해 키보드 해제하기
먼저 위에 처럼 키보드가 올라와 있을 때 바깥 쪽을 터치해서 키보드를 해제하는 방법에 대해 보려고 한다. 짤에서는 바깥을 터치했다는 점이 안 나타나긴하는데 키보드 바깥을 터치해서 키보드를 해제했다.
먼저 바깥을 터치한다고 했는데, 바탕이 되는 ViewController나 view가 있을 것이다. 여기에 tapGeture를 추가한다. viewDidLoad()
같은 곳에서 하면 된다.
let tapGesture = UITapGestureRecognizer(target: self, action: #selector(dismissKeyBoard))
self.view.addGestureRecognizer(tapGesture)
그리고 위에서 selector 로 넘겨준 dismissKeyBoard
메서드를 정의해준다. 이 메서드의 안에서는 키보드가 올라온 이유(textField나 textView를 터치해서 키보드를 올린 경우 등등 )가 되는 target에 resignFirstResponder()
를 호출한다.
@objc private func dismissKeyBoard(_ sender: UITapGestureRecognizer) {
myTextView.resignFirstResponder()
}
여기서 resignFirstResponder()
는 공식 문서의 설명을 보면 아래와 같이 나와있다.
Notifies this object that it has been asked to relinquish its status as first responder in its window.
즉 위의 예를 보면 textView가 현재 첫 번째 responder인 상태를 포기하겠다는 소리다. 그래서 위의 코드가 실행이 되면 텍스트 필드의 focus가 해제되어 키보드가 자동으로 내려가게 되는 것이다.
2. return 키를 눌러 키보드 해제하기
이 경우 textField인지, textView인지에 따라 구현하는 방법이 다르다.
먼저 textView인 경우, UITextViewDelegate
를 채택해서 아래의 메서드를 구현한다. 물론 이때 textview의 delegate 프로퍼티를 설정하는 것을 잊으면 안된다.
extension ViewController: UITextViewDelegate {
func textView(_ textView: UITextView, shouldChangeTextIn range: NSRange, replacementText text: String) -> Bool {
if text == "\n" {
textView.resignFirstResponder()
return false
}
return true
}
}
그리고 textField인 경우는 UITextFieldDelegate
를 채택해서 아래의 메서드를 구현한다.
func textFieldShouldReturn(_ textField: UITextField) -> Bool {
if textField == inputText {
textField.resignFirstResponder()
return false
}
return true
}
이제 이렇게 하면 return 키를 눌렀을 때 키보드가 해제된다.