Was wäre auf dem neuen iPhone X der beste Weg, um sowohl die obere als auch die untere Höhe für die unsicheren Bereiche zu ermitteln?
ios
iphone-x
safearealayoutguide
Tulleb
quelle
quelle
keyWindow
war es immernil
so, dass ich es geändertwindows[0]
und?
aus der optionalen Verkettung entfernt habe, dann hat es funktioniert.Um die Höhe zwischen den Layout-Anleitungen zu ermitteln, müssen Sie dies nur tun
Also
full frame height = 812.0
,safe area height = 734.0
Unten sehen Sie das Beispiel, in dem die grüne Ansicht einen Rahmen von hat
guide.layoutFrame
quelle
UIApplication.sharedApplication.keyWindow.safeAreaLayoutGuide.layoutFrame
, was den sicheren Rahmen hat.Swift 4, 5
Das Anheften einer Ansicht an einen sicheren Bereichsanker mithilfe von Einschränkungen kann an einer beliebigen Stelle im Lebenszyklus des Ansichtscontrollers erfolgen, da diese von der API in die Warteschlange gestellt und nach dem Laden der Ansicht in den Speicher verarbeitet werden. Das Abrufen von Sicherheitsbereichswerten erfordert jedoch das Warten gegen Ende des Lebenszyklus eines View Controllers, z
viewDidLayoutSubviews()
.Dies wird an jeden View Controller angeschlossen:
Ich bevorzuge diese Methode, um sie aus dem Fenster zu entfernen (wenn möglich), da die API so entworfen wurde und, was noch wichtiger ist, die Werte bei allen Ansichtsänderungen aktualisiert werden, z. B. bei Änderungen der Geräteorientierung.
Einige benutzerdefinierte Ansichtssteuerungen können die oben beschriebene Methode jedoch nicht verwenden (ich vermute, weil sie sich in vorübergehenden Containeransichten befinden). In solchen Fällen können Sie die Werte vom Root-View-Controller abrufen, der immer überall im Lebenszyklus des aktuellen View-Controllers verfügbar ist.
quelle
viewDidLayoutSubviews
(die mehrfach aufgerufen werden kann). Hier ist eine Lösung, die auch inviewDidLoad
folgenden FällenKeine der anderen Antworten hier hat für mich funktioniert, aber das hat funktioniert.
quelle
Alle Antworten hier sind hilfreich. Vielen Dank an alle, die Hilfe angeboten haben.
Wie ich jedoch sehe, ist das Thema des sicheren Bereichs etwas verwirrt, was nicht gut dokumentiert zu sein scheint.
Deshalb werde ich es hier so gut wie möglich zusammenfassen, um es leicht verständlich zu machen
safeAreaInsets
,safeAreaLayoutGuide
undLayoutGuide
.In iOS 7 führte Apple die Eigenschaften
topLayoutGuide
undbottomLayoutGuide
in einUIViewController
. Sie ermöglichten es Ihnen, Einschränkungen zu erstellen, um zu verhindern, dass Ihre Inhalte durch UIKit-Leisten wie Status, Navigation oder Registerkartenleiste ausgeblendet werden. Mit diesen Layout-Anleitungen konnten Sie Einschränkungen für den Inhalt festlegen und diese vermeiden durch obere oder untere Navigationselemente (UIKit-Leisten, Statusleiste, Navigations- oder Registerkartenleiste…) ausgeblendet werden.Wenn Sie beispielsweise eine Tabellenansicht erstellen möchten, die vom oberen Bildschirm aus beginnt, haben Sie Folgendes getan:
In iOS 11 hat Apple diese Eigenschaften abgelehnt und sie durch eine einzige Anleitung zum Layout sicherer Bereiche ersetzt
Sicherer Bereich laut Apple
Unten ein sicherer Bereich, der in iPhone 8 und iPhone X-Serie hervorgehoben wird:
Das
safeAreaLayoutGuide
ist eine Eigenschaft vonUIView
So erhalten Sie die Höhe von
safeAreaLayoutGuide
:Dadurch wird die Höhe des Pfeils in Ihrem Bild zurückgegeben.
Was ist nun mit der Anzeige der oberen "Kerbe" und der unteren Höhe des Startbildschirms?
Hier werden wir die verwenden
safeAreaInsets
Im Folgenden werden der unsichere Bereich und der Abstand zu den Kanten des iPhone 8 und eines der iPhone X-Serien angezeigt.
Nun, wenn Navigationsleiste hinzugefügt
Wie kann man nun die Höhe des unsicheren Bereichs ermitteln? Wir werden die verwenden
safeAreaInset
Hier sind Lösungen, die sich jedoch in einer wichtigen Sache unterscheiden:
Erster:
Dadurch werden die EdgeInsets zurückgegeben. Sie können jetzt oben und unten darauf zugreifen, um die Insets zu kennen.
Das Zweite:
Beim ersten Mal nehmen Sie die Ansichtseinfügungen auf. Wenn also eine Navigationsleiste vorhanden ist, wird diese berücksichtigt. Beim zweiten Mal greifen Sie jedoch auf die safeAreaInsets des Fensters zu, sodass die Navigationsleiste nicht berücksichtigt wird
quelle
In iOS 11 gibt es eine Methode, die angibt, wann sich safeArea geändert hat.
quelle
Ich arbeite mit CocoaPods Frameworks und im Falle
UIApplication.shared
ist nicht verfügbar , dann verwende ichsafeAreaInsets
im Hinblick auf diewindow
:quelle
safeAreaLayoutGuide Wenn die Ansicht auf dem Bildschirm angezeigt wird, spiegelt diese Anleitung den Teil der Ansicht wider, der nicht von Navigationsleisten, Registerkartenleisten, Symbolleisten und anderen Vorfahrenansichten abgedeckt wird. (In tvOS spiegelt der sichere Bereich den Bereich wider, der die Bildschirmblende nicht abdeckt.) Wenn die Ansicht derzeit nicht in einer Ansichtshierarchie installiert ist oder auf dem Bildschirm noch nicht sichtbar ist, entsprechen die Kanten der Layoutführung den Kanten der Ansicht.
Um die Höhe des roten Pfeils im Screenshot zu ermitteln, gilt Folgendes:
quelle
Swift 5, Xcode 11.4
Es wird eine Abwertungswarnung ausgegeben. '' keyWindow '' war in iOS 13.0 veraltet: Sollte nicht für Anwendungen verwendet werden, die mehrere Szenen unterstützen, da aufgrund verbundener Szenen ein Schlüsselfenster für alle verbundenen Szenen zurückgegeben wird. Ich benutze diesen Weg.
quelle
Objective-C Wer hatte das Problem , wenn keyWindow gleich ist Null . Fügen Sie einfach den obigen Code in viewDidAppear ein (nicht in viewDidLoad).
quelle
quelle
Swift 5-Erweiterung
Dies kann als Erweiterung verwendet und aufgerufen werden mit: UIApplication.topSafeAreaHeight
Die Erweiterung von UIApplication ist optional, kann eine Erweiterung von UIView sein oder was auch immer bevorzugt wird, oder wahrscheinlich sogar eine globale Funktion.
quelle
Ein runderer Ansatz
quelle