[swift] 사용자 정의 뷰에서 키보드 관리하기

iOS 앱을 개발할 때 사용자가 입력 필드를 탭하면 키보드가 표시되고, 뷰가 키보드로 가려지는 문제를 자주 마주하게 됩니다. 특히, 사용자 정의 뷰를 만들 때 이 문제를 해결해야 할 때가 많습니다.

문제점 이해

사용자 정의 뷰에서 키보드 관리는 주로 두 가지 문제를 처리해야 합니다.

  1. 키보드의 상태 감지: 키보드가 표시되거나 사라질 때를 감지해서 뷰의 레이아웃을 조정해야 합니다.
  2. 입력 필드와 키보드 간의 충돌 해결: 입력 필드가 키보드에 가려지지 않도록 키보드의 높이에 따라 뷰를 스크롤하거나 이동시켜야 합니다.

해결책

1. 키보드의 상태 감지

UIKit에서는 UIViewControllerUIKeyboardWillShowNotificationUIKeyboardWillHideNotification을 활용해서 키보드의 상태 변화를 감지할 수 있습니다. UITextFieldDelegate를 사용하여 입력 필드의 포커스 상태를 감지할 수도 있습니다.

예를 들어, 아래와 같이 UIKeyboardWillShowNotificationUIKeyboardWillHideNotification 옵저버를 등록하여 키보드가 표시될 때와 사라질 때의 액션을 처리할 수 있습니다.

NotificationCenter.default.addObserver(self, selector: #selector(keyboardWillShow), name: UIResponder.keyboardWillShowNotification, object: nil)
NotificationCenter.default.addObserver(self, selector: #selector(keyboardWillHide), name: UIResponder.keyboardWillHideNotification, object: nil)

2. 입력 필드와 키보드 간의 충돌 해결

UIScrollView를 포함한 뷰에 입력 필드와 키보드 간의 간격을 유지하기 위해 contentInsetscrollIndicatorInsets 프로퍼티를 수정해야 합니다. 또한, 입력 필드가 키보드에 가려지지 않도록 하기 위해 필요에 따라 뷰를 이동시켜야 합니다.

아래는 키보드와 입력 필드 간의 레이아웃을 조정하는 예시입니다.

@objc func keyboardWillShow(notification: Notification) {
    guard let userInfo = notification.userInfo,
        let keyboardFrameValue = userInfo[UIResponder.keyboardFrameEndUserInfoKey] as? NSValue else {
        return
    }

    let keyboardFrame = keyboardFrameValue.cgRectValue
    let safeAreaBottom = view.safeAreaInsets.bottom
    let keyboardHeight = keyboardFrame.height - safeAreaBottom

    // Adjust view layout based on keyboard height
}

@objc func keyboardWillHide(notification: Notification) {
    // Reset view layout when keyboard is dismissed
}

결론

사용자 정의 뷰에서 키보드를 관리하기 위해서는 키보드의 상태를 감지하고, 입력 필드와 키보드 간의 충돌을 해결하는 데 주의를 기울여야 합니다. 위에서 제시한 방법을 활용하여 깔끔한 사용자 경험을 제공할 수 있습니다.

참고 자료: Apple Developer Documentation, SwiftUITextFieldDelegate Protocol