【swift】キーボードの高さを取得する

キーボードの高さを取得する必要があったため検索してみたが出てきたものでは2回目以降、正常な高さが取得できなかったのでAppleのドキュメントを読んで調べてみた

参考:Apple https://developer.apple.com/documentation/uikit/uiresponder

まずはキーボードの開閉の通知を登録

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

キーボードが開いたときの処理

@objc func keyboardWillShow(_ notification: Notification) {
  guard let userInfo = notification.userInfo as? [String: Any] else {
    return
  }
  guard let duration = userInfo[UIResponder.keyboardAnimationDurationUserInfoKey] as? Double else {
    return
  }
  //キーボードの高さを取得
  guard let rect = (notification.userInfo?[UIResponder.keyboardFrameEndUserInfoKey] as? NSValue)?.cgRectValue else {
    return
  }
  UIView.animate(withDuration: duration , delay: 0.5, animations: {
    ここでキーボードぼ高さに応じた処理をおこなう
  })
}

キーボードが閉じたときの処理は下記の通り

@objc private func keyboardWillHide(_ notification: Notification) {
 //キーボードが閉じたときの処理
}

原因

2回目で取得できなかった原因は「UIResponder.keyboardFrameBeginUserInfoKey」が使われていたこと

1回目は取得できるが、2回目は高さが正常にとれず、少し小さな数字を取得してしまう。

「UIResponder.keyboardFrameEndUserInfoKey」を使用することにより2回目も正常な数字が取得できた