web-dev-qa-db-ja.com

iPhone Xの余分な下部スペース/パディング?

IPhone Xのポートレートモードで、下部の制限をセーフエリアに0に設定すると、画面の下部に余分なスペースができてしまいます。この余分なパディングの高さをプログラムでどのように取得しますか?

34のこのパディングの高さを手動で決定することができました。iPhoneX検出で実装する方法は次のとおりです。

Swift 4.0およびXcode 9.

if UIDevice().userInterfaceIdiom == .phone
{
    switch UIScreen.main.nativeBounds.height
    {
        case 2436: //iPhone X
        self.keyboardInAppOffset.constant = -34.0
        default:
        self.keyboardInAppOffset.constant = 0
    }
}

このパディングの高さを検出するよりクリーンな方法はありますか?

40
standousset

IOS 11では、ビューにはsafeAreaInsetsプロパティがあります。これらのインセットのbottomプロパティを取得すると、iPhone Xでの最下部のパディングの高さを取得できます。

if #available(iOS 11.0, *) {
    let bottomPadding = view.safeAreaInsets.bottom
    // ...
}

(同様に、ステータスバー付きの上部パディングの場合)

60
Paolo

Objective-C

if (@available(iOS 11.0, *)) {
   UIWindow *window = UIApplication.sharedApplication.keyWindow;
   CGFloat bottomPadding = window.safeAreaInsets.bottom;
}
38
user6788419
var bottomPadding: CGFloat = 0.0
if #available(iOS 11.0, *) {
     let window = UIApplication.shared.keyWindow
     bottomPadding = window?.safeAreaInsets.bottom ?? 0.0
}

これで、必要に応じてbottomPaddingを使用できます。

8
Hemang

CollectionViewLayoutなどのビューが突然ない場合は、Windowからも取得できます。

private static var itemHeight: CGFloat {
    guard #available(iOS 11.0, *),
        let window = UIApplication.shared.keyWindow else {
            return Constants.itemHeight
    }
    return Constants.itemHeight - window.safeAreaInsets.bottom
}
6
Azon

iOS 11(上記の回答からのミックス)

let padding = UIApplication.shared.keyWindow?.safeAreaInsets.bottom ?? 0

5

この行を使用して、iPhoneXの最低価格になります

if #available(iOS 11.0, *) {
            let bottomPadding = view.safeAreaInsets.bottom
  }

これを追加することを忘れないでくださいlayoutSubviews() safeAreaInsetsのlayoutSubviews()のサイズは正しいため、そうでない場合は間違った値になります。

2
Osman