iOS11-キーボードの高さがキーボード通知で0を返しています


84

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

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

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

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

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

回答:


190

これを使って:

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

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

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

1
あなたは私の日を救った
Helen Zhukova 2017年

1
おかげで、それについては決して考えませんでした
Ammar Hadzic 2017年

5
UIKeyboardFrameBeginUserInfoKeyからUIKeyboardFrameEndUserInfoKeyに変更すると、トリックが実行されました。
user2408952 2017年

おかげで、私は半日投資しましたが、理解できませんでした。残りの半日を節約してくれてありがとう。
マニッシュナハール2017

@Akshayそれぞれの画面境界でのキーボードの開始フレームと終了フレームだけです。
s.zainulabideen 2018年

102

交換 UIKeyboardFrameBeginUserInfoKey

UIKeyboardFrameEndUserInfoKey

以下はAppleDocsからのものです。

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

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


13
それはまた、彼らはUIKeyboardFrameBeginUserInfoKeyを使用するアップルのドキュメントからiOSの11にもう動作していないため、Appleは、その後、そのサンプルコードを更新する必要がある:developer.apple.com/library/content/documentation/...を
wildcat12

私の問題を解決しました!アドバイスありがとうございます!
アーニー

私が5歳のように、これら2つの違いは何か、UIScrollViewを自動的にスクロールさせることに関して、なぜこれが違いを生むのかを誰かが説明できますか?本当にありがたいです。ありがとう!
マリオ

numPadでテキストフィールドをタップした後は機能しません。テンキーの後で一般的なテキストフィールドをタップすると、キーボードが上にならず、ビューを閉じると下がる
Jack Daniel

7

これを試して:

交換するUIKeyboardFrameBeginUserInfoKeyUIKeyboardFrameEndUserInfoKey


1
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWillChangeFrame:) name:UIKeyboardWillChangeFrameNotification object:nil];メソッドkeyboardWillChangeFrame:は、1回だけでなく、2回以上実行されることもあります。一部のキーボードの上部に特別なツールバーがある場合もありますが、この時点でメソッドは何度も実行されます。したがって、UIKeyboardFrameBeginUserInfoKeyUIKeyboardFrameEndUserInfoKeyに置き換えて、の最終フレームを取得する必要があります。キーボード。
SolinLiu 2017

5

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に置き換えたところ、問題が修正されました。


1
私は同じことに気づきました。また、キーボードが初めて表示されたときにのみ適用されるようです。追加のViewControllerのキーボードは、そのView Controllerで最初に表示されたときに、高さを0として報告しました。
jackofallcode 2017年

5

この問題はiOS11で発生しています。

交換

「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

3

以下のコードを使用してキーボードの高さを計算します。

これは、セーフエリアデバイスと非セーフエリアデバイスの両方で機能します。

コード:

@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

あなたのアプローチは、表示される前にフレームの高さを取得しようとしているので、0にする必要があります。これは、最初の試行ではない理由がわかりません。以下は、Swift4.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
}

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.