Wraz z wprowadzeniem niestandardowych klawiatur w systemie iOS problem ten staje się nieco bardziej złożony.
Krótko mówiąc, UIKeyboardWillShowNotification można wywoływać wiele razy przez niestandardowe implementacje klawiatury:
- Gdy klawiatura systemowa Apple jest otwarta (w układzie pionowym)
- UIKeyboardWillShowNotification jest wysyłane z klawiaturą o wysokości 224
- Gdy klawiatura Swype jest otwarta (w orientacji pionowej):
- UIKeyboardWillShowNotification jest wysyłane z klawiaturą o wysokości 0
- UIKeyboardWillShowNotification jest wysyłane z klawiaturą o wysokości 216
- UIKeyboardWillShowNotification jest wysyłane z klawiaturą o wysokości 256
- Gdy klawiatura SwiftKey jest otwarta (w orientacji pionowej):
- UIKeyboardWillShowNotification jest wysyłane z klawiaturą o wysokości 0
- UIKeyboardWillShowNotification jest wysyłane z klawiaturą o wysokości 216
- UIKeyboardWillShowNotification jest wysyłane z klawiaturą o wysokości 259
Aby poprawnie obsłużyć te scenariusze w jednej linii kodu, musisz:
Zarejestruj obserwatorów w powiadomieniach UIKeyboardWillShowNotification i UIKeyboardWillHideNotification :
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(keyboardWillShow:)
name:UIKeyboardWillShowNotification
object:nil];
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(keyboardWillHide:)
name:UIKeyboardWillHideNotification
object:nil];
Utwórz zmienną globalną, aby śledzić aktualną wysokość klawiatury:
CGFloat _currentKeyboardHeight = 0.0f;
Zaimplementuj keyboardWillShow, aby zareagować na bieżącą zmianę wysokości klawiatury:
- (void)keyboardWillShow:(NSNotification*)notification {
NSDictionary *info = [notification userInfo];
CGSize kbSize = [[info objectForKey:UIKeyboardFrameEndUserInfoKey] CGRectValue].size;
CGFloat deltaHeight = kbSize.height - _currentKeyboardHeight;
_currentKeyboardHeight = kbSize.height;
}
UWAGA: Możesz chcieć animować przesunięcie widoków. Informacji słownik zawiera wartość wprowadzonego przez UIKeyboardAnimationDurationUserInfoKey . Ta wartość może służyć do animowania zmian z taką samą prędkością, jak wyświetlana jest klawiatura.
Zaimplementuj klawiaturęWillHide do resetowania _currentKeyboardHeight i zareaguj na odrzucenie klawiatury:
- (void)keyboardWillHide:(NSNotification*)notification {
NSDictionary *info = [notification userInfo];
CGSize kbSize = [[info objectForKey:UIKeyboardFrameEndUserInfoKey] CGRectValue].size;
_currentKeyboardHeight = 0.0f;
}
keyboardFrameBeginRect
na współrzędne lokalne.