我知道目前iPhone/iPad顶部的状态栏(包括时间、电池和网络连接)对于非视网膜屏幕是20个像素,对于视网膜屏幕是40个像素,但为了未来证明我的应用程序,我希望能够在没有硬编码值的情况下确定这一点。是否有可能通过编程计算出状态栏的高度?
当前回答
编辑 iOS 11的方法是在哪里放置你的视图内容的顶部是UIView的safeAreaLayoutGuide参见UIView文档。
弃用的答案 如果你的目标是iOS 7+, UIViewController的文档建议viewController的topLayoutGuide属性给你状态栏的底部,或者导航栏的底部,如果它也是可见的。这可能是有用的,而且肯定不像以前的许多解决方案那么hack。
其他回答
不要忘记状态栏的框架将位于屏幕的坐标空间中!如果你在横屏模式下启动,你可能会发现宽度和高度互换了。如果你支持横向定向,我强烈建议你使用这个版本的代码:
CGRect statusBarFrame = [self.window convertRect:[UIApplication sharedApplication].statusBarFrame toView:view];
然后你可以直接读取statusBarFrame的height属性。在这个例子中,'View'应该是你希望使用测量值的视图,很可能是应用程序窗口的根视图控制器。
顺便说一句,在通话过程中,状态栏不仅可能会变高,如果状态栏被故意隐藏,它也可能为零。
UIApplication sharedApplication .statusBarFrame.size.height。但是因为所有的大小都是以点为单位,而不是像素,所以状态栏的高度总是等于20。
更新。鉴于这个答案被认为是有帮助的,我应该详细说明。
状态栏高度确实等于20.0f点,除了以下情况:
状态栏已经被setStatusBarHidden:withAnimation:方法隐藏,它的高度等于0.0f点; 正如@Anton指出的那样,在电话应用程序之外的来电或录音会话期间,状态栏高度等于40.0f点。
还有一种情况是状态栏会影响视图的高度。通常,视图的高度等于给定方向的屏幕尺寸减去状态栏高度。然而,如果你在视图显示后动画状态栏(显示或隐藏它),状态栏将改变它的帧,但视图不会,你必须手动调整视图大小在状态栏动画之后(或在动画期间,因为状态栏高度设置为动画开始时的最终值)。
Update 2. There's also a case of user interface orientation. Status bar does not respect the orientation value, thus status bar height value for portrait mode is [UIApplication sharedApplication].statusBarFrame.size.height (yes, default orientation is always portrait, no matter what your app info.plist says), for landscape - [UIApplication sharedApplication].statusBarFrame.size.width. To determine UI's current orientation when outside of UIViewController and self.interfaceOrientation is not available, use [UIApplication sharedApplication].statusBarOrientation.
iOS7更新。即使状态栏的视觉风格改变了,它仍然在那里,它的框架仍然表现相同。关于状态栏我唯一有趣的发现——我分享:你的UINavigationBar的平铺背景也会平铺到状态栏,所以你可以实现一些有趣的设计效果,或者只是给你的状态栏上色。这也不会以任何方式影响状态栏的高度。
iOS中默认状态栏高度为20 pt。
更多信息:http://www.idev101.com/code/User_Interface/sizes.html
试试这个:
CGFloat statusBarHeight = [[UIApplication sharedApplication] statusBarFrame].size.height;
编辑 iOS 11的方法是在哪里放置你的视图内容的顶部是UIView的safeAreaLayoutGuide参见UIView文档。
弃用的答案 如果你的目标是iOS 7+, UIViewController的文档建议viewController的topLayoutGuide属性给你状态栏的底部,或者导航栏的底部,如果它也是可见的。这可能是有用的,而且肯定不像以前的许多解决方案那么hack。
推荐文章
- 更改UITextField和UITextView光标/插入符颜色
- 'Project Name'是通过优化编译的——步进可能会表现得很奇怪;变量可能不可用
- 如何设置回退按钮文本在Swift
- 模拟器慢动作动画现在打开了吗?
- 如何为TableView创建NSIndexPath
- 滑动删除和“更多”按钮(就像iOS 7的邮件应用程序)
- 使UINavigationBar透明
- 如何改变推和弹出动画在一个基于导航的应用程序
- 删除/重置核心数据中的所有条目?
- setNeedsLayout vs. setNeedsUpdateConstraints和layoutIfNeeded vs. updateConstraintsIfNeeded
- 不区分大小写的比较
- 我怎么能得到一个uiimage的高度和宽度?
- 我如何模仿地图应用程序的底部表格?
- 改变导航栏后退按钮的颜色
- iOS应用程序“应用程序无法验证”只在一台设备上