Sur le nouvel iPhone X, quel serait le moyen le plus approprié d'obtenir la hauteur du haut et du bas pour les zones dangereuses?
ios
iphone-x
safearealayoutguide
Tulleb
la source
la source
keyWindow
c'était toujoursnil
donc je l'ai changéwindows[0]
et retiré du?
chaînage facultatif, puis cela a fonctionné.Pour obtenir la hauteur entre les guides de mise en page, vous venez de faire
Alors
full frame height = 812.0
,safe area height = 734.0
Voici l'exemple où la vue verte a un cadre de
guide.layoutFrame
la source
UIApplication.sharedApplication.keyWindow.safeAreaLayoutGuide.layoutFrame
, qui a le cadre sûr.Swift 4, 5
L'épinglage d'une vue à une ancre de zone sûre à l'aide de contraintes peut être effectué n'importe où dans le cycle de vie du contrôleur de vue, car ils sont mis en file d'attente par l'API et gérés une fois la vue chargée en mémoire. Cependant, pour obtenir des valeurs de zone de sécurité, il faut attendre la fin du cycle de vie d'un contrôleur de vue, comme
viewDidLayoutSubviews()
.Cela se branche sur n'importe quel contrôleur de vue:
Je préfère cette méthode à la sortie de la fenêtre (si possible) car c'est ainsi que l'API a été conçue et, plus important encore, les valeurs sont mises à jour lors de tous les changements de vue, comme les changements d'orientation de l'appareil.
Cependant, certains contrôleurs de vue présentés personnalisés ne peuvent pas utiliser la méthode ci-dessus (je pense qu'ils sont dans des vues de conteneur transitoires). Dans de tels cas, vous pouvez obtenir les valeurs du contrôleur de vue racine, qui sera toujours disponible n'importe où dans le cycle de vie du contrôleur de vue actuel.
la source
viewDidLayoutSubviews
(qui peut être appelé plusieurs fois), voici une solution qui fonctionnera même dansviewDidLoad
: stackoverflow.com/a/53864017/7767664Aucune des autres réponses ici n'a fonctionné pour moi, mais cela a fonctionné.
la source
Toutes les réponses ici sont utiles, merci à tous ceux qui ont offert leur aide.
Cependant, comme je vois que le sujet de la zone de sécurité est un peu confus, ce qui ne semble pas être bien documenté.
Je vais donc le résumer ici le plus possible pour le rendre facile à comprendre
safeAreaInsets
,safeAreaLayoutGuide
etLayoutGuide
.Dans iOS 7, Apple a introduit les propriétés
topLayoutGuide
etbottomLayoutGuide
dansUIViewController
, Ils vous ont permis de créer des contraintes pour empêcher votre contenu d'être masqué par les barres UIKit comme l'état, la navigation ou la barre d'onglets Il était possible avec ces guides de mise en page de spécifier des contraintes sur le contenu, en l'évitant à masquer par les éléments de navigation du haut ou du bas (barres UIKit, barre d'état, barre de navigation ou d'onglets…).Donc, par exemple, si vous voulez faire une tableView commence à partir de l'écran supérieur, vous avez fait quelque chose comme ça:
Dans iOS 11, Apple a désapprouvé ces propriétés en les remplaçant par un seul guide de disposition de zone de sécurité
Zone sûre selon Apple
Ci-dessous, une zone de sécurité mise en évidence dans les séries iPhone 8 et iPhone X:
Le
safeAreaLayoutGuide
est une propriété deUIView
Pour obtenir la hauteur de
safeAreaLayoutGuide
:Cela renverra la hauteur de la flèche dans votre image.
Maintenant, que diriez-vous d'obtenir les hauteurs d'indicateur «cran» supérieur et inférieur de l'écran d'accueil?
Ici, nous utiliserons le
safeAreaInsets
Ce qui suit montre la zone dangereuse et la distance des bords sur l'iPhone 8 et l'un des iPhone X-Series.
Maintenant, si la barre de navigation est ajoutée
Alors, maintenant comment obtenir la hauteur de la zone dangereuse? nous utiliserons le
safeAreaInset
Voici les solutions mais elles diffèrent par une chose importante,
Premier:
Cela renverra les EdgeInsets, vous pouvez maintenant accéder au haut et au bas pour connaître les inserts,
Deuxième:
Le premier, vous prenez les inserts de vue, donc s'il y a une barre de navigation, cela sera pris en compte, mais le second vous accédez aux safeAreaInsets de la fenêtre afin que la barre de navigation ne soit pas prise en compte
la source
Dans iOS 11, il existe une méthode qui indique quand le safeArea a changé.
la source
Swift 5, Xcode 11.4
Cela donnera un avertissement de désapprobation. «keyWindow» était obsolète dans iOS 13.0: ne doit pas être utilisé pour les applications qui prennent en charge plusieurs scènes car il renvoie une fenêtre clé sur toutes les scènes connectées »en raison des scènes connectées. J'utilise de cette façon.
la source
Je travaille avec des cadres de CocoaPods et en cas
UIApplication.shared
est disponible alors je l' utilisesafeAreaInsets
en vue dewindow
:la source
safeAreaLayoutGuide Lorsque la vue est visible à l'écran, ce guide reflète la partie de la vue qui n'est pas couverte par les barres de navigation, les barres d'onglets, les barres d'outils et autres vues des ancêtres. (Dans tvOS, la zone de sécurité reflète la zone non couverte par le cadre 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 disposition sont égaux aux bords de la vue.
Ensuite, pour obtenir la hauteur de la flèche rouge dans la capture d'écran, c'est:
la source
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)
la source
la source
Extension Swift 5
Cela peut être utilisé comme une extension et appelé avec: UIApplication.topSafeAreaHeight
L'extension de UIApplication est facultative, peut être une extension de UIView ou tout ce qui est préféré, ou probablement encore mieux une fonction globale.
la source
Une approche plus arrondie
la source
Pour ceux d'entre vous qui passent en mode paysage, vous devez vous assurer d'utiliser viewSafeAreaInsetsDidChange après la rotation pour obtenir les valeurs les plus à jour:
la source