iOSでキーボードが表示するときに
そのまま出すとUITableviewの上に被さって表示される
そのため、キーボードが出ている間はUiTableViewの一番下の位置を
safeareaのボトムでなく
キーボードの上にしたいと思い
やり方を調べてみた
#selectorはobjective-cのメソッドを設定しなければならないので
@objcをつけてメソッドを定義する必要がある
コードはこんな感じ
@IBOutlet weak var tableViewBottomConstraint: NSLayoutConstraint! override func viewWillAppear(_ animated: Bool) { NotificationCenter.default.addObserver(self, selector: #selector(keyboardWillShow), name:UIResponder.keyboardWillShowNotification, object: nil) NotificationCenter.default.addObserver(self, selector: #selector(keyboardWillHide), name:UIResponder.keyboardWillHideNotification, object: nil) } //MARK: KeyBoard @objc func keyboardWillShow(notification: NSNotification) { let userInfo = notification.userInfo! let rect = (userInfo[UIResponder.keyboardFrameEndUserInfoKey] as? NSValue)?.cgRectValue guard let keyboardHeight = rect?.size.height else { return } let tabBarHeight = self.tabBarController?.tabBar.frame.size.height ?? 0 adViewBottomConstraint.constant = -(keyboardHeight - tabBarHeight) } @objc func keyboardWillHide(notification: NSNotification) { tableViewBottomConstraint?.constant = 0 }
キーボードの高さはコールバックでしか取れないのでコールバックで取る
userinfoの中に情報入っている
NSValueは、CGRect等のNSObjectを継承してないものをラップしたもの
keyboardFrameBeginUserInfoKeyと書かれているサイトが多いが
正しくはkeyboardFrameEndUserInfoKeyにする必要がある
keyboardFrameBeginUserInfoKeyだと初回のリクエスト時に0が返ってくので注意
最後の注意はkeyboardFrameEndUserInfoKeyはtabBarの高さが入った高さが取れるので
tabBarの高さを引くことでキーボードの高さになる
そして取得したキーボードの高さをtableviewのボトムの制約から引く
キーボードが隠れた時は制約に0を入れる
これでキーボードが出ている時はtableviewのボトムはキーボードの上に
キーボードが隠れている時はtableivewのボトムはsafeareaのボトムになりましたとさ
参考
https://stackoverflow.com/questions/26689232/scrollview-and-keyboard-swift
https://qiita.com/sgr-ksmt/items/1d72d9973bc6220a5633
https://stackoverflow.com/questions/28264546/uikeyboardframeenduserinfokey-height-incorrect-should-be-48pt-less/34549428