web-dev-qa-db-ja.com

安全なエリアインセットの上下の高さを取得

新しいiPhone Xでは、危険な領域の上下両方の高さを取得するための最も適切な方法は何でしょうか。

enter image description here

100
Tulleb

これを試して :

In Objective C

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

In スイフト

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

レイアウトガイド間の高さを取得するには

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

だからfull frame height = 812.0safe area height = 734.0

以下は、緑色のビューにguide.layoutFrameのフレームがある例です。

enter image description here

49
Ladislav

スイフト4

制約を使用してビューをセーフエリアアンカーに固定することは、制約が舞台裏で自動レイアウトAPIによって処理されるため、View Controllerのライフサイクルの任意の時点で実行できます。ただし、これらの安全な領域の値にアクセスして高さを決定するには、View Controllerのライフサイクルの後半、理想的にはviewDidLayoutSubviews()まで待つ必要があります。

これはどのView Controllerにも接続できます。

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

}

Appleがどのように使用するAPIを設計したのかという理由で、私はこのメソッドがウィンドウから外れるのを好む。すべてがすでにView Controller内にあるときは、ウィンドウのような余分なオブジェクトを参照しないでください。 viewDidLayoutSubviews()を使用することで、安全領域の値は、向きの変更、ダブルハイトのステータスバー、およびビューとその安全領域に対するその他のすべての変更中に更新されます。

46
bsod

ここで他の答えのどれも私のために働きませんでした、しかしこれはしました。

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
  }
3
ScottyBlades

Objective-C keyWindow nil に等しい場合に問題が発生した。上記のコードを viewDidAppear に入れるだけです(viewDidLoadにはありません)。

1
DmitryShapkin

safeAreaLayoutGuideビューが画面上に表示されている場合、このガイドは、ナビゲーションバー、タブバー、ツールバー、および他の祖先ビューで覆われていないビューの部分を反映します。 (tvOSでは、セーフエリアは画面のベゼルを覆わないエリアを反映します。)ビューが現在ビュー階層にインストールされていないか、画面上にまだ表示されていない場合、レイアウトガイドの端はビューの端と等しくなります。

次に、スクリーンショットの赤い矢印の高さを取得するには、次のようにします。

self.safeAreaLayoutGuide.layoutFrame.size.height
0
malhal

私はCocoaPodsフレームワークを使っていて、UIApplication.shared unavailable の場合は、ビューのsafeAreaInsetswindowを使います。

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