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 ?

22
demandé sur standousset 2017-09-15 15:46:41

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)

40
répondu Paolo 2017-09-15 13:34:41

Dans Objective-C

if (@available(iOS 11.0, *)) {
   UIWindow *window = UIApplication.sharedApplication.keyWindow;
   CGFloat bottomPadding = window.safeAreaInsets.bottom;
}
21
répondu user6788419 2017-10-19 11:43:16

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
}
4
répondu Azon 2017-10-18 14:33:33

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.

0
répondu Osman 2018-07-28 16:32:43