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

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

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.


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


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.


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

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
    }
}

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.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.