Edited at

[Swift 4.2] キーボード表示時に画面をずらして、TextField等が隠れないようにする[iOS 12]

Swift 4.2 では少し違っていたため書きました。


ViewController.swift

    // MARK: - ライフサイクル

override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
configureObserver() //Notification発行
}

// MARK: - Notification

/// Notification発行
func configureObserver() {
let notification = NotificationCenter.default
notification.addObserver(self, selector: #selector(keyboardWillShow(_:)),
name: UIResponder.keyboardWillShowNotification, object: nil)
notification.addObserver(self, selector: #selector(keyboardWillHide(_:)),
name: UIResponder.keyboardWillHideNotification, object: nil)
print("Notificationを発行")
}

/// キーボードが表示時に画面をずらす。
@objc func keyboardWillShow(_ notification: Notification?) {
guard let rect = (notification?.userInfo?[UIResponder.keyboardFrameBeginUserInfoKey] as? NSValue)?.cgRectValue,
let duration = notification?.userInfo?[UIResponder.keyboardAnimationDurationUserInfoKey] as? TimeInterval else { return }
UIView.animate(withDuration: duration) {
let transform = CGAffineTransform(translationX: 0, y: -(rect.size.height))
self.view.transform = transform
}
print("keyboardWillShowを実行")
}

/// キーボードが降りたら画面を戻す
@objc func keyboardWillHide(_ notification: Notification?) {
guard let duration = notification?.userInfo?[UIResponder.keyboardAnimationCurveUserInfoKey] as? TimeInterval else { return }
UIView.animate(withDuration: duration) {
self.view.transform = CGAffineTransform.identity
}
print("keyboardWillHideを実行")
}


この方法の問題点は、キーボード表示で一律画面をずらすので、

上の方に配置したTextFieldが隠れてしまうのが問題です。


追記

iOS 9 以降ではNotificationの破棄は不要とのことで、削除しました


参考

【Swift】UITextField, UITextViewがキーボードで隠れるのを防ぐ(UIScrollViewを使わずに)