web-dev-qa-db-de.com

Sichere Bereichseinsatzhöhen und -höhen erhalten

Was wäre beim neuen iPhone X der beste Weg, um die obere und untere Höhe für die unsicheren Bereiche zu erhalten?

 enter image description here

80
Tulleb

Versuche dies :

In Ziel C

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

In Swift  

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

Um die Höhe zwischen den Layout-Hilfslinien zu ermitteln, müssen Sie nur die Höhe ändern

let guide = view.safeAreaLayoutGuide
let height = guide.layoutFrame.size.height

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

Unten ist ein Beispiel, in dem die grüne Ansicht den Rahmen von guide.layoutFrame hat.

 enter image description here

46
Ladislav

Swift 4

Das Anklemmen einer Ansicht an einen sicheren Bereich mit Hilfe von Einschränkungen kann an jedem Punkt des Lebenszyklus des Ansichtscontrollers erfolgen, da Einschränkungen von der Auto-Layout-API im Hintergrund verarbeitet werden. Um auf die Werte dieser sicheren Bereiche zuzugreifen, um ihre Höhe zu bestimmen, muss jedoch erst später im Lebenszyklus des View-Controllers gewartet werden, idealerweise viewDidLayoutSubviews().

Dies wird in jeden Ansichts-Controller eingesteckt:

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

}

Ich ziehe es vor, diese Methode aus dem Fenster zu ziehen, weil Apple die API so gestaltet hat, dass sie verwendet werden kann. Verweisen Sie nicht auf fremde Objekte wie das Fenster, wenn sich bereits alles im View-Controller befindet. Durch die Verwendung von viewDidLayoutSubviews() werden die Werte für sichere Bereiche bei Orientierungsänderungen, Statusleisten mit doppelter Höhe und alle anderen Mutationen der Ansicht und ihrer sicheren Bereiche aktualisiert.

37
bsod

Ich arbeite mit CocoaPods-Frameworks und falls UIApplication.shared nicht verfügbar ist , dann verwende ich safeAreaInsets in window der Ansicht:

if #available(iOS 11.0, *) {
    let insets = view.window?.safeAreaInsets
    let top = insets.top
    let bottom = insets.bottom
}
1
Tai Le

Ziel-C Wer hatte das Problem, wenn keyWindow gleich nil ist. Gib einfach den obigen Code in viewDidAppear ein (nicht in viewDidLoad)

1
DmitryShapkin

Keine der anderen Antworten funktionierte für mich, aber dies tat es. 

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 Wenn die Ansicht auf dem Bildschirm angezeigt wird, gibt diese Anleitung den Teil der Ansicht wieder, der nicht von Navigationsleisten, Registerkartenleisten, Symbolleisten und anderen Ansichten der Vorfahren abgedeckt wird. (In tvOS spiegelt der sichere Bereich den Bereich wider, der nicht über der Bildschirmblende liegt.) Wenn die Ansicht derzeit nicht in einer Ansichtshierarchie installiert ist oder noch nicht auf dem Bildschirm angezeigt wird, entsprechen die Kanten der Layout-Hilfslinien den Rändern der Ansicht.

Dann, um die Höhe des roten Pfeils im Screenshot zu erhalten, ist es:

self.safeAreaLayoutGuide.layoutFrame.size.height
0
malhal