[iOS] - Keyboard dismiss, 바깥을 터치하거나 Return 키를 눌러 키보드 해제하기



키보드가 화면에 올라와 있는 상태에서 바깥을 터치하거나 <kbd>return</kbd> 키를 눌러 키보드를 해제하는 방법을 알아보자.


1. 키보드 바깥을 터치해 키보드 해제하기

test

먼저 위에 처럼 키보드가 올라와 있을 때 바깥 쪽을 터치해서 키보드를 해제하는 방법에 대해 보려고 한다. 짤에서는 바깥을 터치했다는 점이 안 나타나긴하는데 키보드 바깥을 터치해서 키보드를 해제했다.

먼저 바깥을 터치한다고 했는데, 바탕이 되는 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 키를 눌렀을 때 키보드가 해제된다.

test