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
}
}
このパディングの高さを検出するよりクリーンな方法はありますか?
IOS 11では、ビューにはsafeAreaInsets
プロパティがあります。これらのインセットのbottom
プロパティを取得すると、iPhone Xでの最下部のパディングの高さを取得できます。
if #available(iOS 11.0, *) {
let bottomPadding = view.safeAreaInsets.bottom
// ...
}
(同様に、ステータスバー付きの上部パディングの場合)
Objective-C
if (@available(iOS 11.0, *)) {
UIWindow *window = UIApplication.sharedApplication.keyWindow;
CGFloat bottomPadding = window.safeAreaInsets.bottom;
}
var bottomPadding: CGFloat = 0.0
if #available(iOS 11.0, *) {
let window = UIApplication.shared.keyWindow
bottomPadding = window?.safeAreaInsets.bottom ?? 0.0
}
これで、必要に応じてbottomPadding
を使用できます。
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
}
iOS 11(上記の回答からのミックス)
let padding = UIApplication.shared.keyWindow?.safeAreaInsets.bottom ?? 0
この行を使用して、iPhoneXの最低価格になります
if #available(iOS 11.0, *) {
let bottomPadding = view.safeAreaInsets.bottom
}
これを追加することを忘れないでくださいlayoutSubviews() safeAreaInsetsのlayoutSubviews()のサイズは正しいため、そうでない場合は間違った値になります。