プログラミング

【Swift】キーボードが表示されたときに画面が隠れるのを防ぐ

swift-eyecatch

UITextFieldなどでユーザーの入力を受け付ける時、キーボードが表示されますが、何も対処していないと、キーボードによって画面が隠れてしまいます。

特に、インプットする部分が画面の下側にあると、入力している最中の文字が見えなくなって、使いづらくなってしまいます。

今回は、キーボードが表示されたときに、画面を操作して入力欄が見えるようにする方法を記載します。

NotificationCenterにキーボードの通知を登録

キーボードの表示・非表示時を検知するために、NotificationCenterに通知を登録します。

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

で通知を登録することが出来ます。

今回は、”name”に”UIResponder.keyboardWillShowNotification”(表示時)と”UIResponder.keyboardWillHideNotification”(非表示時)を登録します。

次に、それぞれの通知が飛んできたときに処理する関数を記述します。

キーボードのNotificationが飛んできたときの処理を記述

キーボード通知を登録する際に指定した関数を実装します。

@objc private func keyboardWillShow(sender: NSNotification) {}
@objc private func keyboardWillHide(sender: NSNotification) {}

このそれぞれの関数内で画面を操作するコードを記述していきいます。

以下は、UITextFieldでの例です。(UITextFieldをtextFieldという関数で保持している前提です。)

// キーボードが表示された時
@objc private func keyboardWillShow(sender: NSNotification) {
    if textField.isFirstResponder {
        guard let userInfo = sender.userInfo else { return }
        let duration: Float = (userInfo[UIResponder.keyboardAnimationDurationUserInfoKey] as! NSNumber).floatValue
        UIView.animate(withDuration: TimeInterval(duration), animations: { () -> Void in
            let transform = CGAffineTransform(translationX: 0, y: -150)
            self.view.transform = transform
        })
    }
}

// キーボードが閉じられた時
@objc private func keyboardWillHide(sender: NSNotification) {
    guard let userInfo = sender.userInfo else { return }
    let duration: Float = (userInfo[UIResponder.keyboardAnimationDurationUserInfoKey] as! NSNumber).floatValue
    UIView.animate(withDuration: TimeInterval(duration), animations: { () -> Void in
        self.view.transform = CGAffineTransform.identity
    })
}

この例では、textFieldがfirst responderなら、キーボード表示・非表示に速度と同じ速度で、画面にアニメーション操作を加えるということを行っています。

CGAffineTransform(translationX: 0, y: -150)を作成しviewに当てることで、画面をy方向に-150動かしています。

その他にも、UITableViewのbottomConstraintの数値を操作したりするのも良いですね。