iOS 11で導入された新しいセーフエリアレイアウトガイドは、コンテンツがバーの下に表示されないように機能しますが、キーボードは除きます。つまり、キーボードが表示されても、コンテンツはそれの後ろに隠れており、これが私が解決しようとしている問題です。キーボードを含めるためにiOS 11セーフエリアを拡張する
私のアプローチは、キーボード通知を聞いてから、安全領域をadditionalSafeAreaInsets
に調整することに基づいています。ここで
は私のコードです:MyController
は全体の安全なエリアを通って延びているUITableView
とUIViewController
あるよう
override func viewDidLoad() {
let notificationCenter = NotificationCenter.default
notificationCenter.addObserver(self, selector: #selector(keyboardWillShow(notification:)), name: NSNotification.Name.UIKeyboardWillShow, object: nil)
notificationCenter.addObserver(self, selector: #selector(keyboardWillHide(notification:)), name: NSNotification.Name.UIKeyboardWillHide, object: nil)
notificationCenter.addObserver(self, selector: #selector(keyboardWillChange(notification:)), name: NSNotification.Name.UIKeyboardWillChangeFrame, object: nil)
}
//MARK: - Keyboard
extension MyViewController {
@objc func keyboardWillShow(notification: NSNotification) {
let userInfo = notification.userInfo!
let keyboardHeight = (userInfo[UIKeyboardFrameEndUserInfoKey] as! NSValue).cgRectValue.height
additionalSafeAreaInsets = UIEdgeInsets(top: 0, left: 0, bottom: keyboardHeight, right: 0)
UIView.animate(withDuration: 0.3) {
self.view.layoutIfNeeded();
}
}
@objc func keyboardWillHide(notification: NSNotification) {
additionalSafeAreaInsets = UIEdgeInsets(top: 0, left: 0, bottom: 0, right: 0)
UIView.animate(withDuration: 0.3) {
self.view.layoutIfNeeded();
}
}
@objc func keyboardWillChange(notification: NSNotification) {
let userInfo = notification.userInfo!
let keyboardHeight = (userInfo[UIKeyboardFrameEndUserInfoKey] as! NSValue).cgRectValue.height
additionalSafeAreaInsets = UIEdgeInsets(top: 0, left: 0, bottom: keyboardHeight, right: 0)
UIView.animate(withDuration: 0.3) {
self.view.layoutIfNeeded();
}
}
}
これはうまく動作します。キーボードが現れたら、底部が押し上げられて、キーボードの後ろにセルがないようにします。
問題は下部バーにあります。私はまた、セーフエリアに既に含まれている下部にツールバーがあります。したがって、キーボードの高さを完全に安全な領域に設定すると、テーブルビューの下端がボトムバーの高さだけ押し上げられます。この方法をうまく機能させるには、additionalSafeAreaInsets.bottom
を、キーボードの高さから下のバーの高さを差し引いたものに等しくする必要があります。
質問1:下部の現在の安全領域のギャップを取得する最も良い方法は何ですか?手動でツールバーのフレームを取得し、その高さを使用しますか?または、セーフエリアレイアウトガイドからギャップを直接取得することは可能ですか?
質問2:おそらく、下部バーがキーボードのサイズを変えずにサイズを変更できるようにする必要があるので、バーのフレームの変更を聞く方法も実装する必要があります。これはviewWillTransition(to size: CGSize, with coordinator: UIViewControllerTransitionCoordinator)
で最善ですか?それとも他の場所?
これは、iPhoneXに対応するためのより良い解決策です。安全な場所の外にある –
...残念ながら、それはiOS11専用のsafeAreaLayoutGuideを使用しており、iOS9に戻ってサポートする必要があります –
これとiPhone Xに問題はありませんか?キーボードのY位置がiPhone Xに表示されていると、実際の画面に比べて少し高いようです。 – Jonny