iOS8でキーボードの高さの正しい値を取得できません 質問する

iOS8でキーボードの高さの正しい値を取得できません 質問する

キーボードのサイズを判断するために、次のコードを使用しました:

- (void)keyboardWillChange:(NSNotification *)notification {
    NSDictionary* keyboardInfo = [notification userInfo];
    NSValue* keyboardFrameBegin = [keyboardInfo valueForKey:UIKeyboardFrameBeginUserInfoKey];
    CGRect keyboardFrameBeginRect = [keyboardFrameBegin CGRectValue];

}

これをシミュレータで実行しています。

問題は、iOS 8 以降では正しい値が得られず、キーボードの候補が上に表示されていたり、下に押したりすると、異なる (正しくない) 値が得られることです。

キーボードの候補を含むキーボードの正確なサイズを取得するにはどうすればいいですか?

ベストアンサー1

iOS にカスタム キーボードが導入されたことで、この問題は少し複雑になりました。

つまり、UIキーボード通知を表示カスタムキーボード実装によって複数回呼び出されることがあります。

  1. ときアップルシステムキーボードが開かれている(縦向き)
    • UIKeyboardWillShowNotificationはキーボードの高さとともに送信されます224
  2. ときスワイプキーボード開いた状態(縦向き):
    • UIKeyboardWillShowNotificationはキーボードの高さとともに送信されます0
    • UIKeyboardWillShowNotificationはキーボードの高さとともに送信されます216
    • UIKeyboardWillShowNotificationはキーボードの高さとともに送信されます256
  3. ときSwiftKeyキーボード開いた状態(縦向き):
    • UIKeyboardWillShowNotificationはキーボードの高さとともに送信されます0
    • UIKeyboardWillShowNotificationはキーボードの高さとともに送信されます216
    • UIKeyboardWillShowNotificationはキーボードの高さとともに送信されます259

これらのシナリオを 1 行のコードで適切に処理するには、次の操作が必要です。

オブザーバーを登録するUIキーボード通知を表示そしてUIキーボードが通知を非表示にする通知:

[[NSNotificationCenter defaultCenter] addObserver:self
                                         selector:@selector(keyboardWillShow:)
                                             name:UIKeyboardWillShowNotification
                                           object:nil];    
[[NSNotificationCenter defaultCenter] addObserver:self
                                         selector:@selector(keyboardWillHide:)
                                             name:UIKeyboardWillHideNotification
                                           object:nil];

現在のキーボードの高さを追跡するグローバル変数を作成します。

CGFloat _currentKeyboardHeight = 0.0f;

埋め込むキーボード表示現在のキーボードの高さの変更に反応するには:

- (void)keyboardWillShow:(NSNotification*)notification {
   NSDictionary *info = [notification userInfo];
   CGSize kbSize = [[info objectForKey:UIKeyboardFrameEndUserInfoKey] CGRectValue].size;
   CGFloat deltaHeight = kbSize.height - _currentKeyboardHeight; 
   // Write code to adjust views accordingly using deltaHeight
   _currentKeyboardHeight = kbSize.height;
}

注: ビューのオフセットをアニメーション化することもできます。情報辞書にはキーとなる値が含まれていますUIキーボードアニメーション期間ユーザー情報キーこの値を使用すると、表示されるキーボードと同じ速度で変更をアニメーション化できます。

埋め込むキーボードを隠す_currentKeyboardHeight をリセットし、キーボードが閉じられたことに反応します。

- (void)keyboardWillHide:(NSNotification*)notification {
   NSDictionary *info = [notification userInfo];
   CGSize kbSize = [[info objectForKey:UIKeyboardFrameEndUserInfoKey] CGRectValue].size;
   // Write code to adjust views accordingly using kbSize.height
   _currentKeyboardHeight = 0.0f;
}

おすすめ記事