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


当前回答

按照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);

其他回答

Swift 3或Swift 4:

UIApplication.shared.statusBarFrame.height

虽然状态栏通常是20pt高,但在某些情况下,它可能是这个数字的两倍:

当你在打电话的时候(这是一个很常见的场景); 当录音机、Skype或类似的应用程序在后台使用麦克风时; 个人热点激活时;

试试吧,你自己就知道了。将高度硬编码为20pt通常可以工作,直到它不起作用。

所以我赞同H2CO3的答案:

statusBarHeight = [[UIApplication sharedApplication] statusBarFrame].size.height;

编辑 iOS 11的方法是在哪里放置你的视图内容的顶部是UIView的safeAreaLayoutGuide参见UIView文档。

弃用的答案 如果你的目标是iOS 7+, UIViewController的文档建议viewController的topLayoutGuide属性给你状态栏的底部,或者导航栏的底部,如果它也是可见的。这可能是有用的,而且肯定不像以前的许多解决方案那么hack。

对于iOS 13,你可以使用:

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

使用以下单行代码,您可以获得状态栏的高度在任何方向,也如果它是可见的或不可见

#define STATUS_BAR_HIGHT (
    [UIApplicationsharedApplication].statusBarHidden ? 0 : (
        [UIApplicationsharedApplication].statusBarFrame.size.height > 100 ?
            [UIApplicationsharedApplication].statusBarFrame.size.width :
            [UIApplicationsharedApplication].statusBarFrame.size.height
    )
)

这只是一个简单但非常有用的宏,尝试一下,你不需要写任何额外的代码