iOSにカスタムキーボードが導入されると、この問題は少し複雑になります。
つまり、UIKeyboardWillShowNotificationは、カスタムキーボード実装によって複数回呼び出される可能性があります。
- ときは、アップルのシステムキーボードが(ポートレートで)開かれ
- UIKeyboardWillShowNotificationは、キーボードの高さが224で送信されます
- Swypeキーボードを開いたとき(縦向き):
- UIKeyboardWillShowNotificationは、キーボードの高さ0で送信されます
- UIKeyboardWillShowNotificationは、キーボードの高さが216で送信されます
- UIKeyboardWillShowNotificationは、キーボードの高さ256で送信されます
- SwiftKeyキーボードを開いたとき(縦向き):
- UIKeyboardWillShowNotificationは、キーボードの高さ0で送信されます
- UIKeyboardWillShowNotificationは、キーボードの高さが216で送信されます
- UIKeyboardWillShowNotificationは、キーボードの高さが 259で
これらのシナリオを1つのコード行で適切に処理するには、次のことを行う必要があります。
UIKeyboardWillShowNotificationおよびUIKeyboardWillHideNotificationに対してオブザーバーを登録します通知ます。
[[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;
KeyboardWillShowを実装するキーボードの高さの現在の変更に反応するようにを。
- (void)keyboardWillShow:(NSNotification*)notification {
NSDictionary *info = [notification userInfo];
CGSize kbSize = [[info objectForKey:UIKeyboardFrameEndUserInfoKey] CGRectValue].size;
CGFloat deltaHeight = kbSize.height - _currentKeyboardHeight;
_currentKeyboardHeight = kbSize.height;
}
注:ビューのオフセットをアニメーション化することをお勧めします。インフォ辞書はをキーと値が含まれていUIKeyboardAnimationDurationUserInfoKeyを。この値を使用して、表示されているキーボードと同じ速度で変更をアニメーション化できます。
_currentKeyboardHeightをリセットするkeyboardWillHideを実装し、キーボードが閉じられたことに反応します。
- (void)keyboardWillHide:(NSNotification*)notification {
NSDictionary *info = [notification userInfo];
CGSize kbSize = [[info objectForKey:UIKeyboardFrameEndUserInfoKey] CGRectValue].size;
_currentKeyboardHeight = 0.0f;
}
keyboardFrameBeginRect
ローカル座標に変換すると役立つ場合があります。