然而,iPhone X 的显示屏比 4.7 英寸的显示屏多 145pt,因此内容垂直空间增加了大约20%。
若您需要更多信息,请参考苹果公司提供的 iPhone X 人机界面指南文档和这里1、这里2中的详细说明。
状态栏高度
原来是 20pt,现在变成 44pt
由于顶部显示有传感器,新的状态栏分为两个部分。如果您的 UI 在该空间(原来是 20pt 高,现在是 44pt)上做了特殊处理,则因为 iPhone X 上的状态栏更高,确保它可以动态更改高度。一个很棒的事情是,如果用户进行电话或使用导航应用程序,高度不会改变,而这在其他 iPhone 上曾经是这样的情况。
竖屏
导航栏高度 正常情况下为88,大标题时间为140
横版
您可以通过在包含视图控制器中的view
上使用safeAreaInsets
来编程获取导航栏的高度:
let navBarHeight = view.safeAreaInsets.top
这将考虑导航栏是否为大标题以及是否附带搜索栏。
有关更多信息,请参见safeAreaInsets文档。
let xBarHeight = (self.navigationController?.navigationBar.frame.size.height ?? 0.0) + (self.navigationController?.navigationBar.frame.origin.y ?? 0.0)
ObjC:
CGRect navbarFrame = self.navigationController.navigationBar.frame;
float topWidth = navbarFrame.size.width;
float topHeight = navbarFrame.size.height + navbarFrame.origin.y;
我想这可能有些作弊,但将导航栏的高度与其y坐标相加似乎可以在任何设备上给出正确的总高度。
你可以通过以下方式(Swift 3)轻松获取它:
let barHeight = navigationController?.navigationBar.frame.maxY
确保在设置prefersLargeTitles
之后调用才能获得正确的值。
navigationController?.navigationBar.prefersLargeTitles = false
苹果文档中没有规定
根据Geoff Hackworth的说法,它是88
导航标题类型:
iOS 11中增加导航栏高度
navigationController?.navigationBar.prefersLargeTitles = true
// old way of getting keyWindow
//guard let keyWindow = UIApplication.shared.keyWindow else { return }
// new way of getting keyWindow
guard let keyWindow = UIApplication.shared.windows.first(where: { $0.isKeyWindow }) else { return }
let navBarHeight = keyWindow.safeAreaInsets.top
print("navBarHeight:" , navBarHeight)
我从@Paolo的答案中得到了灵感
如果您想知道在哪里需要开始内容,请使用它
extension UIViewController {
var navigationBarbarContentStart: CGFloat {
return self.navigationBarTopOffset + self.navigationBarHeight
}
var navigationBarTopOffset: CGFloat {
return self.navigationController?.navigationBar.frame.origin.y ?? 0
}
var navigationBarHeight: CGFloat {
return self.navigationController?.navigationBar.frame.height ?? 0
}
}