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?
Réponses
Trop de publicités?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
}
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é.
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
}