iOS 11 - Wysokość klawiatury zwraca 0 w powiadomieniu z klawiatury

84

Korzystałem z powiadomień klawiatury bez problemu i uzyskiwałem dokładną wysokość klawiatury.

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

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

ale w iOS 11 rozmiar klawiatury wynosi 0, gdy wywoływane jest powiadomienie.

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

Hassy
źródło

Odpowiedzi:

190

Użyj tego:

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

W przypadku Swift możesz użyć:

let keyboardSize = (notification.userInfo![UIKeyboardFrameEndUserInfoKey] as! NSValue).cgRectValue.size
s.zainulabideen
źródło
1
Uratowałeś mi dzień
Helen Zhukova
1
Dzięki, nigdy bym o tym nie pomyślał
Ammar Hadzic
5
Zmiana z UIKeyboardFrameBeginUserInfoKey na UIKeyboardFrameEndUserInfoKey załatwiła sprawę, thx.
user2408952
Dzięki, zainwestowałem pół dnia, ale nie mogłem tego rozgryźć. dzięki za uratowanie mojego drugiego pół dnia.
Manish Nahar
@Akshay Po prostu startframe i endframe klawiatury w odpowiednich granicach ekranu.
s.zainulabideen
102

Zastąpić UIKeyboardFrameBeginUserInfoKey

z

UIKeyboardFrameEndUserInfoKey

Poniższe pochodzi z Apple Docs.

UIKeyboardFrameBeginUserInfoKey - klucz dla obiektu NSValue zawierający CGRect, który identyfikuje ramkę początkową klawiatury we współrzędnych ekranowych.

UIKeyboardFrameEndUserInfoKey - klucz dla obiektu NSValue zawierający CGRect, który identyfikuje końcową ramkę klawiatury we współrzędnych ekranowych.

Aditya Srivastava
źródło
13
Apple musi wtedy zaktualizować swój przykładowy kod, ponieważ nie działa już na iOS 11. Również z dokumentów Apple, gdzie używają UIKeyboardFrameBeginUserInfoKey: developer.apple.com/library/content/documentation/ ...
wildcat12
Rozwiązał mój problem! Dzięki za radę!
Ernie
Czy ktoś może mi wyjaśnić, jakbym miał 5 lat, jaka jest różnica między tymi dwoma i dlaczego ma to znaczenie, jeśli chodzi o automatyczne przewijanie UIScrollView? Byłbym naprawdę wdzięczny. Dzięki!
Mario
Nie działa po dotknięciu pola tekstowego za pomocą numPad. jeśli po numPadzie dotknę do ogólnego pola tekstowego, klawiatura już nie jest podniesiona i kiedy zamknie widok zejdź
Jack Daniel
7

Spróbuj tego:

wymienić UIKeyboardFrameBeginUserInfoKeyzUIKeyboardFrameEndUserInfoKey

SolinLiu
źródło
1
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWillChangeFrame:) name:UIKeyboardWillChangeFrameNotification object:nil];keyboardWillChangeFrame metoda: jest nie tylko uruchomić raz, może dwa razy, lub more.Maybe niektóre klawiatury mają specjalny pasek na górze czasami metoda będzie działać wiele razy w tym time.So, należy wymienić UIKeyboardFrameBeginUserInfoKey z UIKeyboardFrameEndUserInfoKey aby uzyskać ostateczną klatkę klawiatura.
SolinLiu
5

Miałem podobny problem, używając Xcode w wersji 9.0 (9A235); chociaż używałem Swift. W mojej metodzie keyboardWillShow napisałem:

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

    let heightValue = keyboardSize.height    

    ...
}

O dziwo, przy pierwszym wywołaniu keyboardWillShow heightValue wynosiła 216.0, ale podczas kolejnych wywołań wynosiła 0! Być może jest to błąd Xcode.

Zastąpiłem UIKeyboardFrameBeginUserInfoKey kluczem UIKeyboardFrameEndUserInfoKey i rozwiązałem problem.

andym
źródło
1
Zauważyłem to samo. Wydaje się, że odnosi się to tylko do pierwszego wyświetlenia klawiatury. Klawiatury na dodatkowych kontrolerach widoku zgłosiły wysokość jako 0, gdy po raz pierwszy pokazała się dla tego kontrolera widoku.
jackofallcode
5

Ten problem występuje w systemie iOS 11.

Zastąpić

„UIKeyboardFrameBeginUserInfoKey” z „UIKeyboardFrameEndUserInfoKey”

jak pokazano poniżej, rozwiązałoby problem

Kod celu C:

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
Sujay UN
źródło
3

Oblicz wysokość klawiatury za pomocą poniższego kodu.

Działa zarówno dla urządzeń ze strefą bezpieczną, jak i ze strefą niezabezpieczoną.

Kod:

@objc func keyboardWillShow(notification: Notification) {
    guard let keyboardFrame = notification.userInfo[UIResponder.keyboardFrameEndUserInfoKey] as? NSValue else {
            return
        }    
    let keyboardHeight: CGFloat                    
    if #available(iOS 11.0, *) {
       let window = UIApplication.shared.keyWindow
       let bottomPadding = window?.safeAreaInsets.bottom ?? 0.0
       keyboardHeight = keyboardFrame.cgRectValue.height - bottomPadding
    } else {
       keyboardHeight = keyboardFrame.cgRectValue.height
    }
}
Hitesh Surani
źródło
1

Twoje podejście polega na uzyskaniu wysokości ramy, zanim zostanie wyświetlona, ​​i dlatego powinna wynosić 0, co nie wiem, dlaczego tak nie jest za pierwszym razem! Oto przykład, jak poprawnie uzyskać wysokość klawiatury w Swift 4.2:

func keyboardWillShow(notification: Notification) {

    guard let userInfo = notification.userInfo else { return }

    guard var keyboardFrame: CGRect = (userInfo[UIResponder.keyboardFrameEndUserInfoKey] as? NSValue)?.cgRectValue else { return }

    keyboardFrame = view.convert(keyboardFrame, from: nil)

    let keyboardHeight = keyboardFrame.height
}

To poprawnie zapewni właściwości ramki klawiatury PRZED pojawieniem się klawiatury.

Ramin
źródło