2017-08-15 18 views
72

Używam powiadomień klawiatury bez problemu i uzyskanie dokładnej wysokości klawiatury.iOS 11 - Wysokość klawiatury powraca 0 w powiadomieniu klawiatury

- (void)keyboardDidShow:(NSNotification *) notification{ 
    CGSize keyboardSize = [[[notification userInfo] objectForKey:UIKeyboardFrameBeginUserInfoKey] CGRectValue].size; 

    NSLog(@"%f",keyboardSize.height);} 

, ale w przypadku iOS 11 rozmiar klawiatury wynosi 0 po wywołaniu powiadomienia.

Jaki problem występuje w tym scenariuszu? Używam Xcode 9 Beta 5

Odpowiedz

147

użyj:

CGSize keyboardSize = [[[notification userInfo] objectForKey:UIKeyboardFrameEndUserInfoKey] CGRectValue].size; 

Dla Swift, można użyć:

let keyboardSize = (notification.userInfo![UIKeyboardFrameEndUserInfoKey] as! NSValue).cgRectValue.size 
+1

Uratowałeś moje dni –

+1

Dzięki, nigdy nie myślał o tym –

+3

Zmiana z UIKeyboardFrameBeginUserInfoKey do UIKeyboardFrameEndUserInfoKey wystarczyły, thx. – user2408952

87

Wymień UIKeyboardFrameBeginUserInfoKey

z

UIKeyboardFrameEndUserInfoKey

Poniżej znajduje się z serwisu Apple Docs.

UIKeyboardFrameBeginUserInfoKey- kluczem do obiektu NSValue zawierającej CGRect identyfikującą ramkę początkową klawiaturze we współrzędnych ekranowych.

UIKeyboardFrameEndUserInfoKey - Klucz do obiektu NSValue zawierający CGRect, który identyfikuje końce ramki klawiatury we współrzędnych ekranu .

+10

Apple musi zaktualizować swój przykładowy kod, ponieważ nie działa już na iOS 11. Również z dokumentów Apple, gdzie używają UIKeyboardFrameBeginUserInfoKey: https://developer.apple.com/library/content/documentation/StringsTextFonts/Conceptual /TextAndWebiPhoneOS/KeyboardManagement/KeyboardManagement.html – wildcat12

+0

Rozwiązałem mój problem! Dzięki za radę! – Ernie

+0

Czy ktoś może mi wyjaśnić, że jestem pięciolatką, jaka jest różnica między tymi dwoma elementami i dlaczego ma to wpływ na automatyczne przewijanie UIScrollView? Naprawdę to doceniam. Dzięki! – Mario

7

Spróbuj tego:

Wymień UIKeyboardFrameBeginUserInfoKey z UIKeyboardFrameEndUserInfoKey

+1

'[[NSNotificationCenter defaultCenter] addObserver: selektor własny: @selector (keyboardWillChangeFrame :) name: UIKeyboardWillChangeFrameNotification object: nil];' the method keyboardWillChangeFrame: nie jest uruchamiany tylko raz, może dwa razy lub więcej. Może niektóre klawisze mają specjalny pasek narzędzi na górze, metoda będzie działać wiele razy w tym czasie. Tak, powinieneś zamienić ** UIKeyboardFrameBeginUserInfoKey ** z ** UIKeyboardFrameEndUserInfoKey ** aby uzyskać ostateczną klatkę klawiatury. – SolinLiu

5

miałem podobny problem przy użyciu Xcode w wersji 9.0 (9A235); chociaż używałem Swift. W moim sposobie keyboardWillShow napisałem następujący:

if let keyboardSize = (notification.userInfo?[UIKeyboardFrameBeginUserInfoKey] as? NSValue)?.cgRectValue { 

    let heightValue = keyboardSize.height  

    ... 
} 

O dziwo, po raz pierwszy nazwano keyboardWillShow, heightValue było 216,0, ale podczas kolejnych rozmów stało się 0! Być może jest to błąd Xcode.

Wymieniłem UIKeyboardFrameBeginUserInfoKey na UIKeyboardFrameEndUserInfoKey, a problem został rozwiązany.

+1

Zauważyłem to samo. Wydaje się również, że odnosi się to tylko do pierwszej klawiatury. Klawiatury dodatkowych kontrolerów widoku podały wysokość jako 0 przy pierwszym wyświetleniu tego kontrolera widoku. – jackofallcode

1

Ten problem dzieje się na iOS 11.

Wymień

"UIKeyboardFrameBeginUserInfoKey" z "UIKeyboardFrameEndUserInfoKey"

jak pokazano poniżej by rozwiązać problem

Objective-C Kod:

CGSize keyboardSize = [[[notification userInfo] objectForKey:UIKeyboardFrameEndUserInfoKey] CGRectValue].size; 

Swift 2.3:

let keyboardSize = (NfnPsgVar.userInfo![UIKeyboardFrameEndUserInfoKey] as? NSValue)?.CGRectValue().size 

Swift 3:

let keyboardSize = (notification.userInfo![UIKeyboardFrameEndUserInfoKey] as! NSValue).cgRectValue.size 
Powiązane problemy