46 votes

La hauteur du clavier de l'iPhoneX et de l'iPhone 8 est différente

J'utilise le code ci-dessous pour obtenir la hauteur du clavier. Ensuite, j'utilise cette hauteur pour calculer le cadre d'un clavier. UIView pour s'assurer que cette UIView juste sur le dessus du clavier.

Mais dans le simulateur iPhoneX, la sortie est 333 et le simulateur d'iPhone 8 est 258 .

ENJEU : Si vous utilisez rect.height comme la hauteur du clavier pour le simulateur iPhone 8 alors la disposition est correcte. Pour l'iPhone X, il y a un écart entre le UIView et le clavier. Ce qui signifie 333 est plus élevée que la hauteur réelle du clavier de l'iPhone X.

Quelle est la raison pour laquelle la hauteur est différente ? Et comment obtenir la bonne hauteur de clavier ?

NotificationCenter.default.addObserver(self, selector: #selector(keyboardWillShow), name: .UIKeyboardWillShow, object: nil)

@objc func keyboardWillShow(_ notification: NSNotification) {
        if let rect = (notification.userInfo?[UIKeyboardFrameEndUserInfoKey] as? NSValue)?.cgRectValue {
           print(rect.height)
        } 
    }

Comme dans cette image, la bordure verte devrait être la partie supplémentaire. En fait, j'ai besoin de la partie rouge juste en haut du clavier sans l'espace vert. enter image description here

EDIT

OK, avec l'aide de @Craig j'ai trouvé que cette méthode n'est appelée que par l'iPhone X. Donc je mets à jour le cadre ici. Il suffit de coller le code ici.

La hauteur du fond de la zone de sécurité est de 22.0, ce qui ne semble pas correct.

override func viewSafeAreaInsetsDidChange() {
    if #available(iOS 11.0, *) {
        super.viewSafeAreaInsetsDidChange()
        view.safeAreaInsets.bottom // This value is the bottom safe area place value.
    }
}

EDIT2 Normalement view.safeAreaInsets.bottom devrait être de 34.0, mais si vous utilisez la vue des conteneurs cette valeur peut être différente comme la mienne est de 22.0.

0 votes

Quel est votre problème en fait ? vous demandez une spéculation basée sur une opinion dans votre question.

0 votes

Vous pouvez toujours utiliser rect.height pour calculer ce qui reste ?

0 votes

@holex J'ai modifié ma question. Ma question est que je n'arrive pas à obtenir une hauteur de clavier correcte en rect.height de la notification.

48voto

Kqtr Points 1953

Alors que Réponse de Craig est correcte, vous pourriez ne pas vouloir épingler votre vue à vue.bas ou le bottomLayoutGuide plutôt que le fond de la zone de sécurité (surtout si votre clavier n'est pas toujours ouvert et que vous ne voulez pas que vos vues couvrent la zone de l'indicateur d'accueil).

Voici une solution pour ces cas. Il déduit la hauteur de l'encart inférieur de la zone sécurisée de la hauteur du clavier :

var keyboardHeight = ... // Get the keyboard height from keyboard notification

if #available(iOS 11.0, *) {
    let bottomInset = view.safeAreaInsets.bottom
    keyboardHeight -= bottomInset
}

38voto

Craig Grummitt Points 1671

La hauteur du clavier pour l'iPhone X et l'iPhone 8 devrait être correcte. Je ne peux que supposer que vous avez peut-être un problème dans votre code pour localiser la "partie rouge", et que votre hypothèse était que la hauteur du clavier était incorrecte, alors que le problème se trouvait en fait dans le code de l'iPhone X. emplacement de la vue. Maintenant - la raison du problème de localisation ? Ma deuxième supposition est que la partie rouge est épinglée au guide de disposition de la zone de sécurité inférieure, qui sur l'iPhone 8 est 0, mais sur l'iPhone X est inséré 34 points.

Cette image illustre à la fois la différence de hauteur des claviers et le fait qu'il est possible de dessiner un rectangle juste au-dessus du clavier en utilisant la hauteur du clavier indiquée dans le fichier de configuration de l'ordinateur. NSNotification pour le keyboardWillShow méthode :

enter image description here

Si vous voulez partager votre code / vos contraintes pour le positionnement de la vue rouge, je devrais être en mesure de vous montrer le problème.

-Edit : Pour ceux qui souhaitent savoir comment j'ai extrait le rectangle rouge, je l'explique dans un article de blog. aquí .

0 votes

Oui, je pense que vous avez raison. "L'encart est de 34 pt", j'ai essayé view.safeAreaInset dans les deux iPhone 8 et iPhone X semble tout (0,0,0,0), comment obtenir cette valeur ?

5 votes

Si vous l'avez essayé dans viewDidLoad il semble que cette valeur ne soit pas encore fixée à ce stade. Vous pouvez remplacer viewSafeAreaInsetsDidChange pour voir cette valeur : override func viewSafeAreaInsetsDidChange() { print(view.safeAreaInsets) }

6voto

Fede Henze Points 56

Cela fonctionne pour tous les appareils et toutes les versions d'iOS jusqu'à présent.

- (void)keyboardWillShown:(NSNotification*)aNotification
{
        NSDictionary* info = [aNotification userInfo];
        CGFloat kbHeight = [[info objectForKey:UIKeyboardFrameEndUserInfoKey] CGRectValue].size.height;
        CGFloat safeAreaBottomInset = 0;
        if (@available(iOS 11.0, *)) {
            safeAreaBottomInset = self.view.safeAreaInsets.bottom;
        }
        self.containerViewBottomConstraint.constant += (kbHeight - safeAreaBottomInset); //In my case I use a constraint to adapt the UI when the keyboard is presented
        [self.view layoutIfNeeded];
}

0 votes

Il suffit d'épingler la contrainte de Superview.Bottom. Zone non sécurisée.

0voto

iDev750 Points 82

J'ai également été confronté à ce problème. Ce que j'ai fait, c'est simplement vérifier le clavier qui est différent sur l'iPhone 7 et l'iPhone X. J'ai juste ajouté une marge par défaut avec la hauteur du clavier. Maintenant, il fonctionne bien sur tous les appareils.

0voto

Sakshi Singla Points 391

Override func viewDidLoad() { super.viewDidLoad()

    NotificationCenter.default.addObserver(self, selector: #selector(keyboardWillShow), name: UIResponder.keyboardWillShowNotification, object: nil)
    NotificationCenter.default.addObserver(self, selector: #selector(keyboardWillHide), name: UIResponder.keyboardWillHideNotification, object: nil)
}
//Here keyboard is without any toolbar and suggestions boxes
@objc func keyboardWillShow(notification: NSNotification) {
    if let keyboardSize = (notification.userInfo?[UIResponder.keyboardFrameBeginUserInfoKey] as? NSValue)?.cgRectValue {
        let keyboardHeight = ((keyboardSize.height) > 240) ? 220 :  (keyboardSize.height - 47)
        self.view.layoutIfNeeded()
    }

}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X