iPhone X 上的额外底部空间/填充?

Posted

技术标签:

【中文标题】iPhone X 上的额外底部空间/填充?【英文标题】:Extra bottom space/padding on iPhone X? 【发布时间】:2017-09-15 12:46:41 【问题描述】:

在 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
    

有没有更简洁的方法来检测这个填充的高度?

【问题讨论】:

请参阅此参考:medium.com/@hacknicity/… 看看这个可能会有帮助medium.com/the-traveled-ios-developers-guide/… 【参考方案1】:

在 iOS 11 中,视图具有 safeAreaInsets 属性。如果您获得这些插图的 bottom 属性,您可以在 iPhone X 上获得底部填充的高度:

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

(同样适用于带有状态栏的顶部填充)

【讨论】:

【参考方案2】:

Objective-C

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

【讨论】:

是的! view.safeAreaInsets.bottom 返回0,您的提示正确返回:34 我回应其他用户。是的! “view.safeAreaInsets.bottom 返回 0,您的提示正确返回:34。”也适用于我 这在您想要获得“真正的”底部安全区域时很有用。如果那里有一个标签栏,那么我发现 vc.view.safeAreaInsets.bottom 包含标签栏高度,这是有道理的。但我希望我的自定义操作表覆盖工具栏,但不是一直到底部。所以这让我得到了我需要的号码。【参考方案3】:
var bottomPadding: CGFloat = 0.0
if #available(iOS 11.0, *) 
     let window = UIApplication.shared.keyWindow
     bottomPadding = window?.safeAreaInsets.bottom ?? 0.0

现在您可以根据需要使用bottomPadding

【讨论】:

【参考方案4】:

如果你突然没有视图,例如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

【讨论】:

【参考方案5】:

iOS 11(以上答案的混合)

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

【讨论】:

【参考方案6】:
UIApplication.shared.windows.first?.safeAreaInsets.bottom ?? 0.0

iOS 13 及更高版本

【讨论】:

这应该更高,因为 keyWindow 在 iOS 13 中已被贬值【参考方案7】:

用这条线成为你的 iPhoneX 的底价

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

并且不要忘记在 layoutSubviews() 中添加这个 ,因为 safeAreaInsets 在 layoutSubviews() 中具有正确的大小,否则您将成为错误的值。

【讨论】:

以上是关于iPhone X 上的额外底部空间/填充?的主要内容,如果未能解决你的问题,请参考以下文章

垂直定位 UIBarButtonItem(对于 iPhone X)

如何删除 textView 上的顶部和底部填充?

如何将图像限制在 iPhone X 上的 View Controller 底部(低于 home 指示器)

引导程序上的移动视图在容器底部有额外的空白空间

每行的流布局中的额外填充

iPhone X 将对象底部对齐到安全区域废墟在其他设备上的外观