Sur l'iPhone X en mode portrait, si vous définissez une contrainte inférieure sur la zone sécurisée sur 0, vous vous retrouvez avec un espace supplémentaire en bas de l'écran. Comment obtenez-vous par programme la hauteur de ce rembourrage supplémentaire?
J'ai réussi à déterminer manuellement la hauteur de ce rembourrage qui est de 34 et voici comment j'ai réussi à l'implémenter avec la détection iPhone X:
Swift 4.0 et Xcode 9.
if UIDevice().userInterfaceIdiom == .phone
{
switch UIScreen.main.nativeBounds.height
{
case 2436: //iPhone X
self.keyboardInAppOffset.constant = -34.0
default:
self.keyboardInAppOffset.constant = 0
}
}
Existe-t-il un moyen plus propre de détecter la hauteur de ce rembourrage?
Dans iOS 11, les vues ont une propriété safeAreaInsets
. Si vous obtenez la propriété bottom
de ces incrustations, vous pouvez obtenir la hauteur du remplissage du bas lorsque vous utilisez l'iPhone X:
if #available(iOS 11.0, *) {
let bottomPadding = view.safeAreaInsets.bottom
// ...
}
(de même pour le remplissage supérieur avec barre d'état)
Dans Objective-C
if (@available(iOS 11.0, *)) {
UIWindow *window = UIApplication.sharedApplication.keyWindow;
CGFloat bottomPadding = window.safeAreaInsets.bottom;
}
var bottomPadding: CGFloat = 0.0
if #available(iOS 11.0, *) {
let window = UIApplication.shared.keyWindow
bottomPadding = window?.safeAreaInsets.bottom ?? 0.0
}
Vous pouvez maintenant utiliser bottomPadding
selon vos besoins.
Si du coup vous n'avez plus de vue, par exemple, CollectionViewLayout, vous pouvez aussi la récupérer à partir de Window:
private static var itemHeight: CGFloat {
guard #available(iOS 11.0, *),
let window = UIApplication.shared.keyWindow else {
return Constants.itemHeight
}
return Constants.itemHeight - window.safeAreaInsets.bottom
}
iOS 11 (un mélange des réponses ci-dessus)
let padding = UIApplication.shared.keyWindow?.safeAreaInsets.bottom ?? 0
utilisez cette ligne pour devenir votre valeur inférieure pour iPhoneX
if #available(iOS 11.0, *) {
let bottomPadding = view.safeAreaInsets.bottom
}
et n'oubliez pas d'ajouter ceci dans layoutSubviews () car safeAreaInsets a la taille correcte dans layoutSubviews (), sinon vous deviendrez des valeurs incorrectes.