web-dev-qa-db-ja.com

iOS 11-キーボード通知でキーボードの高さが0を返す

キーボード通知を問題なく使用し、キーボードの正確な高さを取得しています。

- (void)keyboardDidShow:(NSNotification *) notification{
    CGSize keyboardSize = [[[notification userInfo] objectForKey:UIKeyboardFrameBeginUserInfoKey] CGRectValue].size;

    NSLog(@"%f",keyboardSize.height);}

iOS 11では、通知が呼び出されたときのキーボードのサイズは0です。

このシナリオで発生する問題は何ですか? Xcode 9 Beta 5を使用しています

79
Hassy

これを使って:

CGSize keyboardSize = [[[notification userInfo] objectForKey:UIKeyboardFrameEndUserInfoKey] CGRectValue].size;

Swiftの場合、次を使用できます。

let keyboardSize = (notification.userInfo![UIKeyboardFrameEndUserInfoKey] as! NSValue).cgRectValue.size
180
s.zainulabideen

UIKeyboardFrameBeginUserInfoKeyを置換

UIKeyboardFrameEndUserInfoKey

以下はApple Docsからのものです。

UIKeyboardFrameBeginUserInfoKey-画面座標でキーボードの開始フレームを識別するCGRectを含むNSValueオブジェクトのキー。

UIKeyboardFrameEndUserInfoKey-画面座標でキーボードの終了フレームを識別するCGRectを含むNSValueオブジェクトのキー。

99

これを試して:

UIKeyboardFrameBeginUserInfoKeyUIKeyboardFrameEndUserInfoKeyに置き換えます

7
SolinLiu

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に置き換え、問題を修正しました。

5
andym

この問題は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
2
Sujay U N

以下のコードを使用してキーボードの高さを計算します。 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
    }
}
1
iMHitesh Surani

あなたのアプローチは、フレームが表示される前にフレームの高さを取得しようとしているので、それが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
}

これにより、キーボードフレームプロパティが正しく提供されますの前にキーボードが表示されます。

1
Ramin