화면에 나타난 키보드를 숨기려면 iOS SDK에 미리 정의되어 있는 내부 함수들을 활용해야 합니다. 키보드는 사용자가 텍스트 필드(TextField)나 텍스트 뷰(TextView)에 입력을 시작할 때 자동으로 나타나는데, 이를 닫으려면 해당 입력 요소의 상태에 맞는 함수를 적절히 호출해 주어야 합니다.
1. resignFirstResponder()로 특정 필드의 키보드 숨기기
가장 기본적인 방법은 resignFirstResponder()를 호출하는 것입니다. 예를 들어 현재 포커스된 텍스트 필드가 tfOne이라면 아래 코드 한 줄로 키보드를 숨길 수 있습니다.
tfOne.resignFirstResponder()
이 코드는 호출되는 즉시 키보드를 내립니다. 버튼의 액션(action) 메서드나 제스처 인식기(GestureRecognizer) 안에서 호출하면 원하는 시점에 키보드를 닫을 수 있습니다.
2. 여러 텍스트 필드를 위한 범용 함수 만들기
텍스트 필드가 한두 개일 때는 위 방법으로 충분하지만, 화면에 텍스트 필드나 텍스트 뷰가 많다면 각각 일일이 처리하는 것은 비효율적입니다. 이럴 때는 화면 어디든 탭하면 키보드가 닫히도록 하나의 공통 함수를 만들어 사용하는 것이 좋습니다.
func hideKeyboardWhenTappedAround() {
let tap: UITapGestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(UIViewController.dismissKeyboard))
tap.cancelsTouchesInView = false
view.addGestureRecognizer(tap)
}
@objc func dismissKeyboard() {
view.endEditing(true)
}이 함수를 뷰 컨트롤러 클래스 안에서 호출하면, 텍스트 필드나 텍스트 뷰 바깥 영역을 탭할 때마다 키보드가 자동으로 숨겨집니다.
- cancelsTouchesInView = false: 탭 제스처가 다른 버튼이나 컨트롤의 터치 이벤트를 가로채지 않도록 설정하는 옵션입니다.
- view.endEditing(true): 현재 뷰 계층 구조에서 편집 중인 모든 텍스트 필드의 포커스를 강제로 해제하여 키보드를 내립니다.
3. UIViewController 확장(Extension)으로 재사용성 높이기
위 함수는 제스처를 추가할 대상 뷰가 필요하기 때문에, 매번 뷰 컨트롤러마다 코드를 복사하는 것은 번거롭습니다. UIViewController 확장(Extension)으로 만들어 두면 프로젝트의 모든 화면에서 손쉽게 재사용할 수 있습니다.
extension UIViewController {
func hideKeyboardWhenTappedAround() {
let tap: UITapGestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(UIViewController.dismissKeyboard))
tap.cancelsTouchesInView = false
view.addGestureRecognizer(tap)
}
@objc func dismissKeyboard() {
view.endEditing(true)
}
}이제 각 뷰 컨트롤러의 viewDidLoad()에서 이 함수를 한 번만 호출해 주면 됩니다. 그 결과, 텍스트 뷰나 텍스트 필드를 제외한 화면의 어느 곳이든 탭할 때마다 키보드가 깔끔하게 사라져 더욱 자연스러운 사용자 경험(UX)을 제공할 수 있습니다.