С появлением пользовательских клавиатур в iOS эта проблема становится немного сложнее.
Короче говоря, UIKeyboardWillShowNotification может вызываться несколько раз с помощью пользовательских реализаций клавиатуры:
- Когда системная клавиатура Apple открыта (в портретной ориентации)
- UIKeyboardWillShowNotification отправляется с высотой клавиатуры 224
- Когда клавиатура Swype открыта (вертикально):
- UIKeyboardWillShowNotification отправляется с высотой клавиатуры 0
- UIKeyboardWillShowNotification отправляется с высотой клавиатуры 216
- UIKeyboardWillShowNotification отправляется с высотой клавиатуры 256
- Когда клавиатура SwiftKey открыта (в портретной ориентации):
- UIKeyboardWillShowNotification отправляется с высотой клавиатуры 0
- UIKeyboardWillShowNotification отправляется с высотой клавиатуры 216
- UIKeyboardWillShowNotification отправляется с высотой клавиатуры 259
Чтобы правильно обрабатывать эти сценарии в одной строке кода, вам необходимо:
Зарегистрируйте наблюдателей против уведомлений 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 . Это значение можно использовать для анимации ваших изменений с той же скоростью, что и отображаемая клавиатура.
Реализация keyboardWillHide на вход сброса _currentKeyboardHeight и реагировать на клавиатуру увольнения:
- (void)keyboardWillHide:(NSNotification*)notification {
NSDictionary *info = [notification userInfo];
CGSize kbSize = [[info objectForKey:UIKeyboardFrameEndUserInfoKey] CGRectValue].size;
_currentKeyboardHeight = 0.0f;
}
keyboardFrameBeginRect
в местные координаты.