З впровадженням спеціальних клавіатур в 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
на місцеві координати.