50 votes

Rembourrage supplémentaire 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 voulez-vous obtenir par programmation à 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 à la mettre en œuvre avec l'iPhone détection de 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
    }
}

Est-il le moyen le plus propre pour détecter la hauteur de ce remplissage ?

72voto

Paolo Points 2209

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 rembourrage du bas lorsque vous êtes sur iPhone X:

 if #available(iOS 11.0, *) {
    let bottomPadding = view.safeAreaInsets.bottom
    // ...
}
 

(de même pour le remplissage supérieur avec barre d'état)

47voto

user6788419 Points 3768

En Objective-C

 if (@available(iOS 11.0, *)) {
   UIWindow *window = UIApplication.sharedApplication.keyWindow;
   CGFloat bottomPadding = window.safeAreaInsets.bottom;
}
 

11voto

Hemang Points 3422
 var bottomPadding: CGFloat = 0.0
if #available(iOS 11.0, *) {
     let window = UIApplication.shared.keyWindow
     bottomPadding = window?.safeAreaInsets.bottom ?? 0.0
}
 

Maintenant, vous pouvez utiliser bottomPadding selon vos besoins.

6voto

Azon Points 39

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
}
 

6voto

Raimondo Previdi Points 193

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

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X