web-dev-qa-db-fra.com

Rembourrage supplémentaire sur iPhone X?

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?

40
standousset

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)

60
Paolo

Dans Objective-C

if (@available(iOS 11.0, *)) {
   UIWindow *window = UIApplication.sharedApplication.keyWindow;
   CGFloat bottomPadding = window.safeAreaInsets.bottom;
}
38
user6788419
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.

8
Hemang

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
}
6
Azon

iOS 11 (un mélange des réponses ci-dessus)

let padding = UIApplication.shared.keyWindow?.safeAreaInsets.bottom ?? 0

5
Raimondo Previdi

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.

2
Osman