【问题标题】:Extra bottom space/padding on iPhone X?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
    }
}

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

【问题讨论】:

标签: ios iphone swift iphone-x


【解决方案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() 中具有正确的大小,否则您将成为错误的值。

          【讨论】: