web-dev-qa-db-fra.com

iOS 8 obtient la hauteur du clavier

J'ai du mal à obtenir de façon fiable la hauteur réelle du clavier. J'ajoute une barre d'outils personnalisée qui doit être placée directement au-dessus du clavier. Pour ce faire, avec des contraintes de mise en page, j'ai ajouté une contrainte d'espace statique entre le bas de l'écran et le bas de la barre d'outils. Lorsque le clavier est affiché, je modifie cette contrainte pour qu'elle soit la hauteur du clavier, qui varie beaucoup dans iOS 8.

Pour redimensionner l'espaceur, j'utilise actuellement la méthode suivante qui se déclenche sur UIKeyboardDidShowNotification

-(void)keyboardDidShow:(NSNotification*)notification
{
   CGFloat height = [[notification.userInfo objectForKey:UIKeyboardFrameBeginUserInfoKey] CGRectValue].height;

   self.shimConstraint.constant = height;
   [self.view layoutIfNeeded];
}

Cela redimensionne parfois la contrainte correctement, mais souvent la hauteur de clavier renvoyée est entièrement incorrecte. Quelle est la meilleure façon d'obtenir de manière fiable la hauteur du clavier une fois qu'il est affiché?

EDIT: L'application permet à l'utilisateur de basculer entre plusieurs champs de saisie différents. Certains d'entre eux ont la correction automatique désactivée, de sorte que la barre de correction automatique peut être masquée ou non, et des hauteurs incorrectes sont renvoyées lors du changement de champs.

29
James

La façon dont vous le faites est correcte, mais vous souhaiterez peut-être utiliser UIKeyboardFrameEndUserInfoKey au lieu de UIKeyboardFrameBeginUserInfoKey. La clé de l'utilisateur final est l'image du clavier lorsqu'elle est animée et à l'écran, vous savez donc que ce sera cette image, tandis que la touche de début peut ne pas toujours correspondre à ce que l'image du clavier sera lorsqu'elle est affichée.

Il pourrait également être nécessaire de prendre en compte des considérations supplémentaires sur l'orientation de l'appareil, je n'ai pas examiné cela, mais pour le portrait, cela devrait fonctionner.

35
Kris Gellci

La façon correcte de procéder consiste à utiliser la propriété inputAccesorryView de UITextField.

InputAccessoryView est automatiquement ajouté au-dessus du clavier, quelle que soit la taille du clavier.

Comme l'indique la documentation:

La valeur par défaut de cette propriété est nil. L'affectation d'une vue à cette propriété entraîne l'affichage de cette vue au-dessus du clavier système standard (ou au-dessus de la vue d'entrée personnalisée si elle est fournie) lorsque le champ de texte devient le premier répondeur. Par exemple, vous pouvez utiliser cette propriété pour attacher une barre d'outils personnalisée au clavier

Voir plus d'informations ici https://developer.Apple.com/library/ios/documentation/StringsTextFonts/Conceptual/TextAndWebiPhoneOS/InputViews/InputViews.html

8
Jason Kirchner

Vous devrez peut-être faire [self.view setNeedsLayout] au lieu de [self.view layoutIfNeeded].

0
Dhaval