キーボードのサイズを判断するために、次のコードを使用しました:
- (void)keyboardWillChange:(NSNotification *)notification {
NSDictionary* keyboardInfo = [notification userInfo];
NSValue* keyboardFrameBegin = [keyboardInfo valueForKey:UIKeyboardFrameBeginUserInfoKey];
CGRect keyboardFrameBeginRect = [keyboardFrameBegin CGRectValue];
}
これをシミュレータで実行しています。
問題は、iOS 8 以降では正しい値が得られず、キーボードの候補が上に表示されていたり、下に押したりすると、異なる (正しくない) 値が得られることです。
キーボードの候補を含むキーボードの正確なサイズを取得するにはどうすればいいですか?
ベストアンサー1
iOS にカスタム キーボードが導入されたことで、この問題は少し複雑になりました。
つまり、UIキーボード通知を表示カスタムキーボード実装によって複数回呼び出されることがあります。
- ときアップルシステムキーボードが開かれている(縦向き)
- UIKeyboardWillShowNotificationはキーボードの高さとともに送信されます224
- ときスワイプキーボード開いた状態(縦向き):
- UIKeyboardWillShowNotificationはキーボードの高さとともに送信されます0
- UIKeyboardWillShowNotificationはキーボードの高さとともに送信されます216
- UIKeyboardWillShowNotificationはキーボードの高さとともに送信されます256
- とき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;
}