[swift] SnapKit으로 키보드 인식 및 자동 완성 처리하기

이번에는 SnapKit을 사용하여 iOS 앱에서 키보드 인식 및 자동 완성을 처리하는 방법에 대해 알아보겠습니다. SnapKit은 Swift로 작성된 오픈 소스 라이브러리로, Auto Layout을 쉽게 구현할 수 있도록 도와줍니다.

SnapKit이란?

SnapKit은 Masonry에서 영감을 받아 만들어진 Swift용 Auto Layout 라이브러리입니다. SnapKit을 사용하면 코드로 Auto Layout을 설정할 때 유연하고 간결한 구문을 사용할 수 있습니다.

SnapKit을 사용하기 위해 먼저 프로젝트에 SnapKit을 추가해야 합니다. CocoaPods를 사용하는 경우, Podfile에 다음과 같은 줄을 추가하고 터미널에서 pod install을 실행하면 됩니다.

pod 'SnapKit'

키보드 인식 처리하기

키보드가 표시되거나 사라질 때 알림을 받아 키보드 인식을 처리할 수 있습니다. 먼저, UIViewControllerviewWillAppear 메서드에서 키보드 표시 및 사라짐 알림에 대해 옵저버를 등록해야 합니다.

override func viewWillAppear(_ animated: Bool) {
    super.viewWillAppear(animated)
    
    NotificationCenter.default.addObserver(self, selector: #selector(keyboardWillShow), name: UIResponder.keyboardWillShowNotification, object: nil)
    NotificationCenter.default.addObserver(self, selector: #selector(keyboardWillHide), name: UIResponder.keyboardWillHideNotification, object: nil)
}

위의 코드에서 keyboardWillShowkeyboardWillHide는 각각 키보드가 표시될 때와 사라질 때 호출될 메서드입니다.

키보드가 표시될 때 호출되는 keyboardWillShow 메서드에서는 키보드의 크기를 가져와 뷰의 제약 조건을 업데이트해야 합니다. 이때 SnapKit을 사용하면 코드를 간편하게 작성할 수 있습니다.

@objc func keyboardWillShow(notification: NSNotification) {
    if let keyboardSize = (notification.userInfo?[UIResponder.keyboardFrameEndUserInfoKey] as? NSValue)?.cgRectValue {
        // 키보드 크기를 가져와 뷰의 제약 조건을 업데이트하는 코드 작성
        view.snp.makeConstraints { make in
            make.bottom.equalToSuperview().offset(-keyboardSize.height)
        }
    }
}

위의 코드에서 make.bottom.equalToSuperview().offset(-keyboardSize.height)은 뷰의 하단 가장자리를 슈퍼뷰의 가장자리에서 키보드의 높이만큼 빼는 제약 조건을 생성합니다.

키보드가 사라질 때 호출되는 keyboardWillHide 메서드에서는 뷰의 제약 조건을 초기화해야 합니다.

@objc func keyboardWillHide(notification: NSNotification) {
    // 뷰의 제약 조건을 초기화하는 코드 작성
    view.snp.removeConstraints()
}

자동 완성 처리하기

키보드에서 입력 받은 내용에 따라 자동 완성 기능을 처리하려면 UITextFieldDelegate 프로토콜을 준수하는 뷰 컨트롤러로부터 키보드 입력을 받을 수 있어야 합니다.

자동 완성을 처리하기 위해 viewDidLoad 메서드에서 텍스트 필드의 delegate를 설정합니다.

override func viewDidLoad() {
    super.viewDidLoad()

    textField.delegate = self
}

이제 UITextFieldDelegate 프로토콜의 textField(_:shouldChangeCharactersIn:replacementString:) 메서드를 사용하여 텍스트 필드의 입력을 모니터링하고 자동 완성을 처리할 수 있습니다.

func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {
    let currentText = textField.text ?? ""
    let newText = (currentText as NSString).replacingCharacters(in: range, with: string)
    
    // 자동 완성 처리하는 코드 작성
    if newText == "apple" {
        textField.text = "apple pie"
        return false
    }
    
    return true
}

위의 코드에서는 입력된 텍스트가 “apple”일 경우 “apple pie”로 자동 완성을 처리하고, 입력을 막으려면 return false를 반환합니다.

SnapKit을 사용하여 키보드 인식 및 자동 완성 처리를 구현하는 방법에 대해 간단히 알아보았습니다. SnapKit을 활용하면 Auto Layout을 쉽게 구현할 수 있다는 점과 키보드와 텍스트 필드의 상호작용을 유연하게 처리할 수 있다는 장점을 활용해 보세요.

참고 자료