これを試して :
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
}
スイフト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()
を使用することで、安全領域の値は、向きの変更、ダブルハイトのステータスバー、およびビューとその安全領域に対するその他のすべての変更中に更新されます。
ここで他の答えのどれも私のために働きませんでした、しかしこれはしました。
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
}
Objective-C keyWindow が nil に等しい場合に問題が発生した。上記のコードを viewDidAppear に入れるだけです(viewDidLoadにはありません)。
safeAreaLayoutGuideビューが画面上に表示されている場合、このガイドは、ナビゲーションバー、タブバー、ツールバー、および他の祖先ビューで覆われていないビューの部分を反映します。 (tvOSでは、セーフエリアは画面のベゼルを覆わないエリアを反映します。)ビューが現在ビュー階層にインストールされていないか、画面上にまだ表示されていない場合、レイアウトガイドの端はビューの端と等しくなります。
次に、スクリーンショットの赤い矢印の高さを取得するには、次のようにします。
self.safeAreaLayoutGuide.layoutFrame.size.height
私はCocoaPodsフレームワークを使っていて、UIApplication.shared
が unavailable の場合は、ビューのsafeAreaInsets
でwindow
を使います。
if #available(iOS 11.0, *) {
let insets = view.window?.safeAreaInsets
let top = insets.top
let bottom = insets.bottom
}