222 votes

Obtenez des hauteurs de haut et de bas dans la zone sécurisée

Sur le nouvel iPhone X, quel serait le moyen le plus approprié d’obtenir la hauteur maximale et minimale pour les zones non sécurisées?

entrez la description de l'image ici

454voto

user6788419 Points 3768

Essaye ça :

En objectif c

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

En rapide

 if #available(iOS 11.0, *) {
    let window = UIApplication.shared.keyWindow
    let topPadding = window?.safeAreaInsets.top
    let bottomPadding = window?.safeAreaInsets.bottom
}
 

110voto

Ladislav Points 1303

Pour obtenir la hauteur entre les guides de mise en page que vous venez de faire

 let guide = view.safeAreaLayoutGuide
let height = guide.layoutFrame.size.height
 

So full frame height = 812.0 , safe area height = 734.0

Voici l'exemple où la vue verte a un cadre de guide.layoutFrame

entrez la description de l'image ici

92voto

bsod Points 3192

Swift 4

À la broche, en vue d'une zone de sécurité d'ancrage à l'aide de contraintes peut être fait à n'importe quel point dans le point de vue du contrôleur de cycle de vie parce que les contraintes sont gérées par la mise en page automatique de l'API derrière les coulisses. Toutefois, pour accéder à la valeur de ces zones de sécurité afin de déterminer leurs hauteurs il faut attendre jusqu'à tard dans la vue du contrôleur de cycle de vie, idéalement viewDidLayoutSubviews().

Cette branche dans n'importe quelle vue-contrôleur:

override func viewDidLayoutSubviews() {
    super.viewDidLayoutSubviews()

    var topSafeArea: CGFloat
    var bottomSafeArea: CGFloat

    if #available(iOS 11.0, *) {
        topSafeArea = view.safeAreaInsets.top
        bottomSafeArea = view.safeAreaInsets.bottom
    } else {
        topSafeArea = topLayoutGuide.length
        bottomSafeArea = bottomLayoutGuide.length
    }

    // safe area values are now available to use

}

Je préfère cette méthode pour l'obtenir hors de la fenêtre parce que c'est la façon dont Apple a conçu l'API à utiliser. Ne pas référence les objets parasites comme la fenêtre quand tout est déjà dans le point de vue du contrôleur. Et en utilisant viewDidLayoutSubviews(), de la zone de sécurité valeurs sont mises à jour lors de changements d'orientation, double-hauteur des barres d'état, et toutes les autres mutations de la vue et de ses zones de sécurité.

29voto

ScottyBlades Points 1262

Aucune des autres réponses ici ne fonctionnait pour moi, mais cela a fonctionné.

 var topSafeAreaHeight: CGFloat = 0
var bottomSafeAreaHeight: CGFloat = 0

  if #available(iOS 11.0, *) {
    let window = UIApplication.shared.windows[0]
    let safeFrame = window.safeAreaLayoutGuide.layoutFrame
    topSafeAreaHeight = safeFrame.minY
    bottomSafeAreaHeight = window.frame.maxY - safeFrame.maxY
  }
 

2voto

Tai Le Points 2489

Je travaille avec les frameworks CocoaPods et dans les cas où UIApplication.shared n'est pas disponible, j'utilise safeAreaInsets dans la vue window :

 if #available(iOS 11.0, *) {
    let insets = view.window?.safeAreaInsets
    let top = insets.top
    let bottom = insets.bottom
}
 

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