在纵向模式下的iPhone X上,如果将安全区域的底部约束设置为0,则最终会在屏幕底部留出额外的空间。 你如何以编程方式获得这个额外填充的高度?
我设法手动确定这个填充的高度是34,这就是我设法用iPhone X检测实现它的方法:
Swift 4.0和Xcode 9.0
if UIDevice().userInterfaceIdiom == .phone
{
switch UIScreen.main.nativeBounds.height
{
case 2436: //iPhone X
self.keyboardInAppOffset.constant = -34.0
default:
self.keyboardInAppOffset.constant = 0
}
}
有没有更清晰的方法来检测此填充的高度?
答案 0 :(得分:53)
在iOS 11中,视图具有safeAreaInsets
属性。如果你得到这些插图的bottom
属性,你可以在iPhone X上获得底部填充的高度:
if #available(iOS 11.0, *) {
let bottomPadding = view.safeAreaInsets.bottom
// ...
}
(同样适用于带状态栏的顶部填充)
答案 1 :(得分:32)
在 Objective-C
中if (@available(iOS 11.0, *)) {
UIWindow *window = UIApplication.sharedApplication.keyWindow;
CGFloat bottomPadding = window.safeAreaInsets.bottom;
}
答案 2 :(得分:5)
如果突然你没有视图,例如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
}
答案 3 :(得分:5)
var bottomPadding: CGFloat = 0.0
if #available(iOS 11.0, *) {
let window = UIApplication.shared.keyWindow
bottomPadding = window?.safeAreaInsets.bottom ?? 0.0
}
现在,您可以根据需要使用bottomPadding
。
答案 4 :(得分:3)
iOS 11 (来自以上答案的组合)
let padding = UIApplication.shared.keyWindow?.safeAreaInsets.bottom ?? 0
答案 5 :(得分:2)
使用此行成为iPhoneX的底价
if #available(iOS 11.0, *) {
let bottomPadding = view.safeAreaInsets.bottom
}
别忘了将此添加到layoutSubviews()中,因为safeAreaInsets在layoutSubviews()中具有正确的大小,否则您将得到错误的值。
答案 6 :(得分:2)
UIApplication.shared.windows.first?.safeAreaInsets.bottom ?? 0.0
iOS 13及更高版本