web-dev-qa-db-fra.com

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?

 enter image description here

80
Tulleb

Essaye ça :

Dans Objectif C

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

Dans Swift  

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

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

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

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

 enter image description here

46
Ladislav

Swift 4

Pour épingler une vue sur une ancre de zone sans danger à l'aide de contraintes, vous pouvez utiliser n'importe quel point du cycle de vie du contrôleur de vue, car les contraintes sont gérées par l'API de présentation automatique en arrière-plan. Cependant, pour accéder aux valeurs de ces zones de sécurité afin de déterminer leurs hauteurs, il faut attendre plus tard dans le cycle de vie du contrôleur de vue, idéalement viewDidLayoutSubviews().

Cela se branche sur n’importe quel contrôleur de vue:

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 la sortir de la fenêtre, car c’est ainsi que Apple a conçu l’API à utiliser. Ne faites pas référence à des objets superflus comme la fenêtre lorsque tout est déjà dans le contrôleur de vue. Et à l'aide de viewDidLayoutSubviews(), les valeurs de zone sécurisée sont mises à jour lors des changements d'orientation, des barres d'état double hauteur et de toutes les autres mutations de la vue et de ses zones sécurisées.

37
bsod

Je travaille avec les frameworks CocoaPods et dans le cas où UIApplication.shared est indisponible alors 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
}
1
Tai Le

Objective-C Qui a eu le problème lorsque keyWindow est égal à nil . Il suffit de mettre le code ci-dessus dans viewDidAppear (pas dans viewDidLoad)

1
DmitryShapkin

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
  }
0
ScottyBlades

safeAreaLayoutGuide Lorsque la vue est visible à l'écran, ce guide indique la partie de la vue qui n'est pas couverte par les barres de navigation, les barres d'onglets, les barres d'outils et les autres vues des ancêtres. (Dans tvOS, la zone sécurisée correspond à la zone non recouverte par le cache de l'écran.) Si la vue n'est pas actuellement installée dans une hiérarchie de vues ou n'est pas encore visible à l'écran, les bords du guide de mise en forme sont égaux aux bords de la vue.

Ensuite, pour obtenir la hauteur de la flèche rouge dans la capture d'écran, il faut:

self.safeAreaLayoutGuide.layoutFrame.size.height
0
malhal