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?
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
}
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.
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
}
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)
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
}
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