La hauteur en portrait et la hauteur en paysage mesurées en points.
La hauteur en portrait et la hauteur en paysage mesurées en points.
Réponses:
J'ai utilisé l'approche suivante pour déterminer le cadre du clavier sous iOS 7.1.
Dans la méthode init de mon contrôleur de vue, je me suis inscrit au UIKeyboardDidShowNotification
:
NSNotificationCenter *center = [NSNotificationCenter defaultCenter];
[center addObserver:self selector:@selector(keyboardOnScreen:) name:UIKeyboardDidShowNotification object:nil];
Ensuite, j'ai utilisé le code suivant keyboardOnScreen:
pour accéder au cadre du clavier. Ce code récupère le userInfo
dictionnaire à partir de la notification, puis accède au fichier NSValue
associé UIKeyboardFrameEndUserInfoKey
. Vous pouvez ensuite accéder au CGRect et le convertir en coordonnées de la vue de votre contrôleur de vue. À partir de là, vous pouvez effectuer tous les calculs dont vous avez besoin en fonction de cette image.
-(void)keyboardOnScreen:(NSNotification *)notification
{
NSDictionary *info = notification.userInfo;
NSValue *value = info[UIKeyboardFrameEndUserInfoKey];
CGRect rawFrame = [value CGRectValue];
CGRect keyboardFrame = [self.view convertRect:rawFrame fromView:nil];
NSLog(@"keyboardFrame: %@", NSStringFromCGRect(keyboardFrame));
}
Rapide
Et l'implémentation équivalente avec Swift:
NotificationCenter.default.addObserver(self, selector: #selector(keyboardDidShow), name: UIResponder.keyboardDidShowNotification, object: nil)
@objc
func keyboardDidShow(notification: Notification) {
guard let info = notification.userInfo else { return }
guard let frameInfo = info[UIResponder.keyboardFrameEndUserInfoKey] as? NSValue else { return }
let keyboardFrame = frameInfo.cgRectValue
print("keyboardFrame: \(keyboardFrame)")
}
N'oubliez pas qu'avec iOS 8, la taille du clavier à l'écran peut varier. Ne supposez pas que le clavier à l'écran sera toujours visible (avec une hauteur spécifique ) ou invisible.
Désormais, avec iOS 8, l'utilisateur peut également activer et désactiver la zone de prédiction de texte ... et quand ils le font, cela déclenche à nouveau l'keyboardWillShow
événement d' une application .
Cela va briser beaucoup d'exemples de code existants, qui a recommandé la rédaction d' un keyboardWillShow
événement, qui mesure simplement la hauteur actuelle du clavier à l' écran, et vos commandes de déplacement vers le haut ou vers le bas sur la page de ce montant (absolue).
En d'autres termes, si vous voyez un exemple de code, qui vous dit simplement d'ajouter un keyboardWillShow
événement, de mesurer la hauteur du clavier, puis de redimensionner les hauteurs de vos contrôles de ce montant, cela ne fonctionnera plus toujours.
Dans mon exemple ci-dessus, j'ai utilisé l'exemple de code du site suivant, qui anime la constant
valeur des contraintes verticales .
Pratiquer la mise en page automatique
Dans mon application, j'ai ajouté une contrainte à mon UITextView
, définie en bas de l'écran. Lorsque l'écran est apparu pour la première fois, j'ai stocké cette distance verticale initiale.
Ensuite, chaque fois que mon keyboardWillShow
événement est lancé, j'ajoute la (nouvelle) hauteur du clavier à cette valeur de contrainte d'origine (donc la contrainte redimensionne la hauteur du contrôle).
Ouais. C'est moche.
Et je suis un peu ennuyé / surpris que l'AutoLayout horriblement douloureux de XCode 6 ne nous permette pas seulement d'attacher le bas des commandes au bas de l'écran ou au haut du clavier à l'écran.
Il me manque peut-être quelque chose.
Autre que ma raison.
La hauteur du clavier est de 216 points pour le mode portrait et de 162 points pour le mode paysage.
note de version: ce n'est plus la valeur dans iOS 9 et 10, car ils prennent en charge les tailles de clavier personnalisées.
Cela dépend du modèle et de la barre QuickType:
La hauteur du clavier dépend du modèle, de la barre QuickType, des paramètres utilisateur ... La meilleure approche est de calculer dinamiquement:
Swift 3.0
var heightKeyboard : CGFloat?
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
NotificationCenter.default.addObserver(self, selector: #selector(self.keyboardShown(notification:)), name: NSNotification.Name.UIKeyboardDidShow, object: nil)
}
func keyboardShown(notification: NSNotification) {
if let infoKey = notification.userInfo?[UIKeyboardFrameEndUserInfoKey],
let rawFrame = (infoKey as AnyObject).cgRectValue {
let keyboardFrame = view.convert(rawFrame, from: nil)
self.heightKeyboard = keyboardFrame.size.height
// Now is stored in your heightKeyboard variable
}
}
Je ne trouve pas la dernière réponse, donc je vérifie tout avec le simulateur. (IOS 11.0)
Appareil | Hauteur de l'écran | Portrait | Paysage
iPhone 4s | 480,0 | 216,0 | 162,0
iPhone 5, iPhone 5s, iPhone SE | 568,0 | 216,0 | 162,0
iPhone 6, iPhone 6s, iPhone 7, iPhone 8, iPhone X | 667,0 | 216,0 | 162,0
iPhone 6 plus, iPhone 7 plus, iPhone 8 plus | 736,0 | 226,0 | 162,0
iPad 5e génération, iPad Air, iPad Air 2, iPad Pro 9.7, iPad Pro 10.5, iPad Pro 12.9 | 1024,0 | 265,0 | 353,0
Merci!
iPhone
ClavierTailles:
2.6S, 6,7,8: (375 × 667): keyboardSize = (0.0, 407.0, 375.0, 260.
3,6 +, 6S +, 7+, 8+: (414 × 736) keyboardSize = (0.0, 465.0, 414.0, 271.0)
4.XS, X: (375 X 812) keyboardSize = (0.0, 477.0, 375.0, 335.0)
5.XR, XSMAX ((414 x 896) taille du clavier = (0,0, 550,0, 414,0, 346,0)