Espace inférieur supplémentaire / rembourrage sur iPhone X?
Sur l'iPhone X en mode portrait, si vous définissez un fond contrainte de zone de sécurité à 0, vous finirez avec un espace supplémentaire au 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 34 Et voici comment j'ai réussi à l'implémenter avec la détection iPhone X:
Swift 4.0 et Xcode 9.0
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 ?
4 réponses
Dans iOS 11, les vues ont une propriété safeAreaInsets
. Si vous obtenez la propriété bottom
de ces encarts, vous pouvez obtenir la hauteur du rembourrage inférieur sur iPhone X:
if #available(iOS 11.0, *) {
let bottomPadding = view.safeAreaInsets.bottom
// ...
}
(de même pour le remplissage supérieur avec la barre d'état)
Dans Objective-C
if (@available(iOS 11.0, *)) {
UIWindow *window = UIApplication.sharedApplication.keyWindow;
CGFloat bottomPadding = window.safeAreaInsets.bottom;
}
Si soudainement vous n'avez pas de vue, par exemple, CollectionViewLayout, vous pouvez également le récupérer à partir de la fenêtre:
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
}
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 de mauvaises valeurs.