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
Utilisez ceci:
CGSize keyboardSize = [[[notification userInfo] objectForKey:UIKeyboardFrameEndUserInfoKey] CGRectValue].size;
Pour Swift, vous pouvez utiliser:
let keyboardSize = (notification.userInfo![UIKeyboardFrameEndUserInfoKey] as! NSValue).cgRectValue.size
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.
Essaye ça:
Remplacez UIKeyboardFrameBeginUserInfoKey
par UIKeyboardFrameEndUserInfoKey
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.
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
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
}
}
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.