ios - 如何以编程方式获取 iOS 状态栏高度

标签 ios uikit retina-display

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

最佳答案

[UIApplication sharedApplication].statusBarFrame.size.height。但由于所有尺寸都以磅为单位,而不是以像素为单位,因此状态栏高度始终等于 20。

更新。看到这个答案被认为有帮助,我应该详细说明。

状态栏高度确实等于 20.0f 点除了以下情况:

  • 已使用 setStatusBarHidden:withAnimation: 方法隐藏状态栏,其高度等于 0.0f 点;
  • 正如@Anton 在这里指出的那样,在电话应用程序之外的来电期间或在录音 session 期间,状态栏高度等于 40.0f 点。

还有一个状态栏会影响 View 高度的情况。通常, View 的高度等于给定方向的屏幕尺寸减去状态栏高度。但是,如果您在显示 View 后为状态栏设置动画(显示或隐藏它),状态栏将更改其框架,但 View 不会,您必须在状态后手动调整 View 大小栏动画(或在动画期间,因为状态栏高度在动画开始时设置为最终值)。

更新 2. 还有一个用户界面方向的情况。状态栏不考虑方向值,因此 portrait 模式的状态栏高度值为 [UIApplication sharedApplication].statusBarFrame.size.height(是的,默认方向始终为纵向,无论您的应用 info.plist 说什么),landscape - [UIApplication sharedApplication].statusBarFrame.size.width。要在 UIViewController 外部和 self.interfaceOrientation 不可用时确定 UI 的当前方向,请使用 [UIApplication sharedApplication].statusBarOrientation

iOS7 更新。尽管状态栏的视觉样式发生了变化,但它仍然存在,其框架的行为仍然相同。我得到的关于状态栏的唯一有趣发现 – 我分享:您的 UINavigationBar平铺背景也将平铺到状态栏,因此您可以实现一些有趣的设计效果或只是给你的状态栏上色。这也不会以任何方式影响状态栏高度。

Navigation bar tiled background is also tiled to status bar

关于ios - 如何以编程方式获取 iOS 状态栏高度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12991935/

相关文章:

ios - 垂直居中 View 、自动调整大小和 iPhone 5 4"屏幕

iphone - childViewController 未接收旋转事件

iphone - 区分 iPad 和 iPhone 的网络图标

iphone - 针对视网膜显示优化的 Sprite

ios - 从 iOS 中的 UILabel 中删除括号

ios - 将 Cocos2d (2.0) 添加到现有的 iPhone 项目

objective-c - 如何向单元格添加额外的字幕

ios - 如何在 Interface Builder 中创建 1px 线?

ios - Swift - 从主线程访问 UIApplication.shared.statusBarOrientation

ios - 旋转 UIView 导致它改变位置