web-dev-qa-db-fra.com

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

J'utilise le code ci-dessous pour obtenir la hauteur du clavier. Utilisez ensuite cette hauteur pour calculer le cadre d'un UIView afin de vous assurer que ce UIView se trouve juste en haut du clavier.

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

[~ # ~] issue [~ # ~] : Si vous utilisez rect.height comme hauteur du clavier pour le simulateur iPhone 8, la disposition est correcte. Pour iPhone X, il y a un écart entre le UIView et le clavier. Ce qui signifie 333 est plus élevé que la hauteur réelle du clavier sur iPhone X.

Quelle est la raison de la hauteur sont différents? 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 cette image, la bordure verte devrait être la partie supplémentaire. En fait, j’ai besoin de la partie rouge située juste au-dessus du clavier sans l’intervalle rectangle vert. enter image description here

[~ # ~] éditer [~ # ~]

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

La hauteur du bas de la zone de sécurité est 22.0 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 34.0, mais si vous utilisez la vue conteneur, cette valeur peut être différente, tout comme la mienne est 22.0.

37
William Hu

La hauteur du clavier pour iPhone X et iPhone 8 doit être correcte. Je peux seulement deviner que vous avez peut-être un problème dans votre code pour localiser la "partie rouge", et que vous supposiez que la hauteur du clavier était incorrecte alors que le problème se trouvait en fait dans le location du vue. Maintenant - la raison du problème de localisation? Ma deuxième hypothèse est que la partie rouge est épinglée dans le guide d'agencement de la zone de sécurité en bas, qui est égal à 0 sur l'iPhone 8, mais à 34 points sur l'iPhone X.

Voir cette image pour illustrer à la fois la différence de hauteur du clavier et le fait qu'il est possible de dessiner un rectangle juste au-dessus du clavier en utilisant la hauteur du clavier à partir de la hauteur du clavier indiquée dans NSNotification pour la méthode keyboardWillShow :

enter image description here

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

- Edit: Pour tous ceux qui sont intéressés à savoir comment extraire le rectangle rouge dessiné, je le décris dans un article de blog ici .

34
Craig Grummitt

Bien que la réponse de Craig soit correcte, vous ne voudrez peut-être pas épingler votre vue à view.bottom ou au bottomLayoutGuide plutôt que la zone de sécurité située en bas (surtout si votre clavier n'est pas toujours ouvert, et vous ne souhaitez pas que vos vues couvrent la zone d’indicateur d’accueil).

Voici un correctif pour ces cas. Il déduit la hauteur du bas 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
}
39
Kqtr

Cela fonctionne pour chaque appareil et version 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];
}
3
Fede Henze

J'ai aussi fait face à ce problème. Ce que j'ai fait, je vérifie simplement que le clavier est différent sur iPhone 7 et iPhone X. Je viens d'ajouter une marge par défaut avec la hauteur du clavier. Maintenant, cela fonctionne bien sur tous les appareils.

0
iDev750

remplacer 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()
    }

}
0
Sakshi Singla