iOS 11 - Tastaturhöhe gibt in der Tastaturbenachrichtigung 0 zurück

83

Ich habe Tastaturbenachrichtigungen ohne Probleme verwendet und die genaue Höhe der Tastatur ermittelt.

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

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

Bei iOS 11 beträgt die Tastaturgröße jedoch 0, wenn die Benachrichtigung aufgerufen wird.

Was ist das Problem in diesem Szenario? Ich benutze xcode 9 Beta 5

Hassy
quelle

Antworten:

188

Benutze das:

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

Für Swift können Sie Folgendes verwenden:

let keyboardSize = (notification.userInfo![UIKeyboardFrameEndUserInfoKey] as! NSValue).cgRectValue.size
s.zainulabideen
quelle
1
Du hast meinen Tag gerettet
Helen Zhukova
1
Danke, daran hätte
Ammar Hadzic
5
Der Wechsel von UIKeyboardFrameBeginUserInfoKey zu UIKeyboardFrameEndUserInfoKey hat den Trick gemacht, danke.
user2408952
Danke, ich habe einen halben Tag investiert, konnte es aber nicht herausfinden. Danke, dass du meinen anderen halben Tag gerettet hast.
Manish Nahar
@Akshay Nur Start- und Endrahmen der Tastatur in den jeweiligen Bildschirmgrenzen.
s.zainulabideen
101

Ersetzen UIKeyboardFrameBeginUserInfoKey

mit

UIKeyboardFrameEndUserInfoKey

Das Folgende ist von Apple Docs.

UIKeyboardFrameBeginUserInfoKey- Der Schlüssel für ein NSValue-Objekt, das ein CGRect enthält, das den Startrahmen der Tastatur in Bildschirmkoordinaten identifiziert.

UIKeyboardFrameEndUserInfoKey - Der Schlüssel für ein NSValue-Objekt, das ein CGRect enthält, das den Endrahmen der Tastatur in Bildschirmkoordinaten identifiziert.

Aditya Srivastava
quelle
13
Apple muss dann seinen Beispielcode aktualisieren, da er unter iOS 11 nicht mehr funktioniert. Auch aus Apple-Dokumenten, in denen UIKeyboardFrameBeginUserInfoKey verwendet wird: developer.apple.com/library/content/documentation/…
wildcat12
Mein Problem gelöst! Danke für den Hinweis!
Ernie
Kann mir jemand erklären, dass ich 5 Jahre alt bin, was der Unterschied zwischen diesen beiden ist und warum dies einen Unterschied macht, wenn es darum geht, dass UIScrollView automatisch scrollt? Das würde ich sehr schätzen. Vielen Dank!
Mario
Es funktioniert nicht, nachdem Sie mit numPad auf ein Textfeld getippt haben. Wenn ich nach numPad auf das allgemeine Textfeld tippe, die Tastatur nicht mehr hoch ist und wenn die Ansicht geschlossen wird, runter
Jack Daniel
7

Versuche dies:

Ersetzen UIKeyboardFrameBeginUserInfoKeydurchUIKeyboardFrameEndUserInfoKey

SolinLiu
quelle
1
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWillChangeFrame:) name:UIKeyboardWillChangeFrameNotification object:nil];Die Methode keyboardWillChangeFrame: wird nicht nur einmal, möglicherweise zweimal oder mehrmals ausgeführt. Möglicherweise wird auf einigen Tastaturen eine spezielle Symbolleiste angezeigt. Die Methode wird zu diesem Zeitpunkt häufig ausgeführt. Sie sollten UIKeyboardFrameBeginUserInfoKey durch UIKeyboardFrameEndUserInfoKey ersetzen , um den endgültigen Frame von zu erhalten die Tastatur.
SolinLiu
5

Ich hatte ein ähnliches Problem mit Xcode Version 9.0 (9A235). obwohl ich Swift benutzte. In meiner keyboardWillShow-Methode habe ich Folgendes geschrieben:

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

    let heightValue = keyboardSize.height    

    ...
}

Seltsamerweise war heightValue beim ersten Aufruf von keyboardWillShow 216,0, aber bei nachfolgenden Aufrufen war es 0 geworden! Vielleicht ist dies ein Xcode-Fehler.

Ich habe den UIKeyboardFrameBeginUserInfoKey durch einen UIKeyboardFrameEndUserInfoKey ersetzt und das Problem für mich behoben.

andym
quelle
1
Mir ist das Gleiche aufgefallen. Es scheint auch nur für das allererste Mal zu gelten, wenn die Tastatur angezeigt wird. Tastaturen auf zusätzlichen Ansichts-Controllern meldeten die Höhe beim ersten Anzeigen für diesen Ansichts-Controller als 0.
Jackofallcode
5

Dieses Problem tritt unter iOS 11 auf.

Ersetzen

"UIKeyboardFrameBeginUserInfoKey" mit "UIKeyboardFrameEndUserInfoKey"

wie unten gezeigt würde das Problem beheben

Ziel-C-Code:

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
quelle
3

Berechnen Sie die Tastaturhöhe mit dem folgenden Code.

Es funktioniert sowohl für Geräte mit sicherem als auch für nicht sicherem Bereich.

Code:

@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
quelle
1

Ihr Ansatz versucht, die Rahmenhöhe zu ermitteln, bevor sie angezeigt wird. Deshalb sollte sie 0 sein. Ich bin mir nicht sicher, warum dies nicht beim ersten Versuch der Fall ist. Hier ist ein Beispiel, wie Sie die Tastaturhöhe in Swift 4.2 korrekt ermitteln können:

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
}

Dadurch werden die Eigenschaften des Tastaturrahmens korrekt bereitgestellt, BEVOR die Tastatur angezeigt wird.

Ramin
quelle