web-dev-qa-db-fra.com

iOS 11 - Keyboard Height renvoie 0 dans la notification de clavier

J'utilise les notifications de clavier sans aucun problème et j'obtiens une hauteur exacte du clavier.

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

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

mais avec iOS 11, la taille du clavier est 0 lorsque la notification est appelée.

Quel est le problème survenant dans ce scénario? J'utilise xcode 9 Beta 5

81
Hassy

Utilisez ceci:

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

Pour Swift, vous pouvez utiliser:

let keyboardSize = (notification.userInfo![UIKeyboardFrameEndUserInfoKey] as! NSValue).cgRectValue.size
183
s.zainulabideen

Remplacez UIKeyboardFrameBeginUserInfoKey

avec

UIKeyboardFrameEndUserInfoKey

La liste ci-dessous provient de Apple Docs.

UIKeyboardFrameBeginUserInfoKey - Clé d'un objet NSValue contenant un CGRect qui identifie l'image de départ du clavier en coordonnées d'écran.

UIKeyboardFrameEndUserInfoKey - Clé d'un objet NSValue contenant un CGRect qui identifie le cadre de fin du clavier en coordonnées d'écran.

100
Aditya Srivastava

Essaye ça:

Remplacez UIKeyboardFrameBeginUserInfoKey par UIKeyboardFrameEndUserInfoKey

7
SolinLiu

J'ai eu un problème similaire avec Xcode Version 9.0 (9A235); bien que j'utilisais Swift. Dans ma méthode keyboardWillShow, j'ai écrit ce qui suit:

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

    let heightValue = keyboardSize.height    

    ...
}

Étrangement, la première fois que keyboardWillShow a été appelé, heightValue était de 216,0, mais lors d'appels suivants, il était devenu 0! C'est peut-être un bug de Xcode.

J'ai remplacé la clé UIKeyboardFrameBeginUserInfoKey par une clé UIKeyboardFrameEndUserInfoKey et le problème a été résolu pour moi.

5
andym

Ce problème se produit sur iOS 11.

Remplacer

"UIKeyboardFrameBeginUserInfoKey" avec "UIKeyboardFrameEndUserInfoKey"

comme indiqué ci-dessous réglerait le problème

Code Objective-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
Sujay U N

Calculez la hauteur du clavier en utilisant le code ci-dessous. Il fonctionne pour les deux périphériques avec les périphériques safe area et non-safe area.

@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
    }
}
2
iMHitesh Surani

Votre approche consiste à essayer d’obtenir la hauteur du cadre avant de l’afficher, et c’est pourquoi il devrait être 0, ce que je ne suis pas sûr de savoir pourquoi ce n’est pas au premier essai! Voici un exemple montrant comment obtenir correctement la hauteur du clavier dans 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
}

Ceci fournira correctement les propriétés du cadre du clavier AVANT le clavier apparaît.

1
Ramin