キーボード通知を問題なく使用し、キーボードの正確な高さを取得しています。
- (void)keyboardDidShow:(NSNotification *) notification{
CGSize keyboardSize = [[[notification userInfo] objectForKey:UIKeyboardFrameBeginUserInfoKey] CGRectValue].size;
NSLog(@"%f",keyboardSize.height);}
iOS 11では、通知が呼び出されたときのキーボードのサイズは0です。
このシナリオで発生する問題は何ですか? Xcode 9 Beta 5を使用しています
これを使って:
CGSize keyboardSize = [[[notification userInfo] objectForKey:UIKeyboardFrameEndUserInfoKey] CGRectValue].size;
Swiftの場合、次を使用できます。
let keyboardSize = (notification.userInfo![UIKeyboardFrameEndUserInfoKey] as! NSValue).cgRectValue.size
UIKeyboardFrameBeginUserInfoKey
を置換
と
UIKeyboardFrameEndUserInfoKey
以下はApple Docsからのものです。
UIKeyboardFrameBeginUserInfoKey-画面座標でキーボードの開始フレームを識別するCGRectを含むNSValueオブジェクトのキー。
UIKeyboardFrameEndUserInfoKey-画面座標でキーボードの終了フレームを識別するCGRectを含むNSValueオブジェクトのキー。
これを試して:
UIKeyboardFrameBeginUserInfoKey
をUIKeyboardFrameEndUserInfoKey
に置き換えます
Xcodeバージョン9.0(9A235)を使用して同様の問題が発生しました。私はSwiftを使用していましたが。 keyboardWillShowメソッドでは、次のように書きました。
if let keyboardSize = (notification.userInfo?[UIKeyboardFrameBeginUserInfoKey] as? NSValue)?.cgRectValue {
let heightValue = keyboardSize.height
...
}
奇妙なことに、keyboardWillShowが初めて呼び出されたとき、heightValueは216.0でしたが、その後の呼び出しでは0になりました!おそらくこれはXcodeのバグです。
UIKeyboardFrameBeginUserInfoKeyをUIKeyboardFrameEndUserInfoKeyに置き換え、問題を修正しました。
この問題はiOS 11で発生しています。
交換
「UIKeyboardFrameBeginUserInfoKey」と「UIKeyboardFrameEndUserInfoKey」
以下に示すように問題を修正します
Objective-Cコード:
CGSize keyboardSize = [[[notification userInfo] objectForKey:UIKeyboardFrameEndUserInfoKey] CGRectValue].size;
Swift 2.3:
let keyboardSize = (NfnPsgVar.userInfo![UIKeyboardFrameEndUserInfoKey] as? NSValue)?.CGRectValue().size
スイフト3:
let keyboardSize = (notification.userInfo![UIKeyboardFrameEndUserInfoKey] as! NSValue).cgRectValue.size
以下のコードを使用してキーボードの高さを計算します。 safe area
およびnon-safe area
デバイスを備えた両方のデバイスで動作しています。
@objc func keyboardWillShow(notification: Notification) {
guard let keyboardFrame = notification.userInfo[UIResponder.keyboardFrameEndUserInfoKey] as? NSValue else {
return
}
let keyboardHeight: CGFloat
if #available(iOS 11.0, *) {
let window = UIApplication.shared.keyWindow
let bottomPadding = window?.safeAreaInsets.bottom ?? 0.0
keyboardHeight = keyboardFrame.cgRectValue.height - bottomPadding
} else {
keyboardHeight = keyboardFrame.cgRectValue.height
}
}
あなたのアプローチは、フレームが表示される前にフレームの高さを取得しようとしているので、それが0になるはずです。 Swift 4.2でキーボードの高さを正しく取得する方法の例を次に示します。
func keyboardWillShow(notification: Notification) {
guard let userInfo = notification.userInfo else { return }
guard var keyboardFrame: CGRect = (userInfo[UIResponder.keyboardFrameEndUserInfoKey] as? NSValue)?.cgRectValue else { return }
keyboardFrame = view.convert(keyboardFrame, from: nil)
let keyboardHeight = keyboardFrame.height
}
これにより、キーボードフレームプロパティが正しく提供されますの前にキーボードが表示されます。