我知道目前iPhone/iPad顶部的状态栏(包括时间、电池和网络连接)对于非视网膜屏幕是20个像素,对于视网膜屏幕是40个像素,但为了未来证明我的应用程序,我希望能够在没有硬编码值的情况下确定这一点。是否有可能通过编程计算出状态栏的高度?


当前回答

对于iOS 13,你可以使用:

UIApplication.shared.keyWindow?.windowScene?.statusBarManager?.statusBarFrame.height

其他回答

斯威夫特5

UIApplication.shared.statusBarFrame.height

iOS中默认状态栏高度为20 pt。

更多信息:http://www.idev101.com/code/User_Interface/sizes.html

我刚刚找到了一种方法,允许您不直接访问状态栏高度,而是计算它。

导航栏高度- topLayoutGuide长度=状态栏高度

迅速:

let statusBarHeight = self.topLayoutGuide.length-self.navigationController?.navigationBar.frame.height

self.topLayoutGuide.length是半透明栏覆盖的顶部区域,self.navigationController?. navigationbar .frame.height是除去状态栏的半透明栏,通常是44pt。因此,通过使用这种方法,您可以很容易地计算状态栏高度,而不用担心状态栏高度因电话呼叫而变化。

Swift 3或Swift 4:

UIApplication.shared.statusBarFrame.height

按照Martin的建议:获取iPhone状态栏高度。

CGFloat AACStatusBarHeight()
{
    CGSize statusBarSize = [[UIApplication sharedApplication] statusBarFrame].size;
    return MIN(statusBarSize.width, statusBarSize.height);
}

在Swift中

func statusBarHeight() -> CGFloat {
    let statusBarSize = UIApplication.shared.statusBarFrame.size
    return Swift.min(statusBarSize.width, statusBarSize.height)
}

看起来像黑客,但实际上很结实。不管怎样,这是唯一可行的解决方案。

旧的答案

下面的代码,会放在UIViewController的自定义子类中,几乎可以支持横向视图。但是,我注意到一个角落的情况(当旋转从右>不支持颠倒>左),它不起作用(切换高度和宽度)。

BOOL isPortrait = self.interfaceOrientation == UIInterfaceOrientationPortrait;
CGSize statusBarSize = [UIApplication sharedApplication].statusBarFrame.size;
CGFloat statusBarHeight = (isPortrait ? statusBarSize.height : statusBarSize.width);