版本:
OS X 10.10.5
Xcode 6.4(6E35b)
iOS >= 7

一、概述

状态栏(UIStatusBar)指iPhone/iPad/iPod屏幕顶部用于显示网络、时间和电量等的、高度为20点的控件。状态栏的windowLevel为UIWindowLevelStatusBar,而window的windowLevel为UIWindowLevelNormal。所以一般情况下,状态栏位于window之上。

二、UIStatusBar的位置和尺寸

 NSString *statusBarFrame = NSStringFromCGRect([UIApplication sharedApplication].statusBarFrame);
NSLog(@"%@", statusBarFrame);
在iPhone 6竖屏测试输出:
2015-08-04 16:33:47.159 Test[6175:205261] {{0, 0}, {375, 20}}
在iPhone 6横屏测试输出:
2015-08-04 16:33:47.159 Test[6175:205261] {{0, 0}, {667, 20}}
在iPhone 6 Plus竖屏测试输出:
2015-08-04 16:33:47.159 Test[6175:205261] {{0, 0}, {414, 20}}
 
可见其中origin.x和origin.y总是0,size.height总是20,size.width依赖于不同设备及横竖屏。

三、UIStatusBarStyle(字体颜色)和背景颜色

UIStatusBarStyle控制状态栏的字体颜色,在iOS7只支持两种:UIStatusBarStyleDefault、UIStatusBarStyleLightContent。注意,虽然目前表现出来的颜色是黑色或白色,但不是Black或White之类的,苹果留了一手以防以后改变。Default表示深色(Dark),用于亮色(Light)背景;LightContent表示亮色(Light),用于深色(Dark)背景。当然这也不是强制的。
在没有导航栏的情况下,状态栏的背景颜色是透明的,可以在View里添加一个20点高度的子View“伪造”一个背景;在有导航栏的情况下,状态栏的背景颜色和状态栏一样,看起来融为了一体。

四、App启动时状态栏控制

App启动的时候系统加载需要一定的时间,可以给App提供了Launch Image或Launch Screen以增强用户体验。在启动页显示出来的时候App还没有运行,也就谈不上在程序中控制状态栏的字体颜色、显示或隐藏。
默认情况下状态栏是显示出来的,并且Style为UIStatusBarStyleDefault,即黑色。

1、隐藏

可以在Info中将Status bar is initially hidden(UIStatusBarHidden)对应的Value设置为Yes。
也可以在General中将Hide status bar勾选:
实际上,上面两种设置方法最终作用到info.plist文件。可以直接修改该文件,如果不嫌麻烦又不担心出错的话。如果没有使用基于ViewController的状态栏控制,并且App内部又需要将状态栏显示出来,可以在AppDelegate中设置:[[UIApplication sharedApplication] setStatusBarHidden:NO];

2、设置字体颜色为白色

可以在Info中将Status bar style(UIStatusBarStyle)对应的Value设置为UIStatusBarStyeLightContent。
也可以在General中将Status Bar style选择为Light:
同样的,上面两种设置方法最终作用到info.plist文件。如果没有使用基于ViewController的状态栏控制,并且App内部又需要将状态栏颜色改为黑色,可以在AppDelegate中设置:
[[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleDefault];

五、App运行时状态栏控制

新建一个Xcode项目,App默认是基于ViewController的状态栏控制,即在ViewController重载prefersStatusBarHidden、preferredStatusBarStyle和preferredStatusBarUpdateAnimation三个方法,及在必要时调用setNeedsStatusBarAppearanceUpdate方法。
如果要使用iOS7之前的通过UIApplication控制状态栏,需在target的info.plist中增加一条View controller-based status bar appearance(UIViewControllerBasedStatusBarAppearance)并设置为NO。
 

1、View controller-based status bar appearance : YES 或 info.plist无此条目

 
UIViewController方法 说明
- (BOOL)prefersStatusBarHidden NS_AVAILABLE_IOS(7_0); // Defaults to NO 询问是否隐藏状态栏。
- (UIStatusBarStyle)preferredStatusBarStyle NS_AVAILABLE_IOS(7_0); // Defaults to UIStatusBarStyleDefault 询问状态栏样式(UIStatusBarStyleDefault/UIStatusBarStyleLightContent)。
// Override to return the type of animation that should be used for status bar changes for this view controller. This currently only affects changes to prefersStatusBarHidden.
- (UIStatusBarAnimation)preferredStatusBarUpdateAnimation NS_AVAILABLE_IOS(7_0); // Defaults to UIStatusBarAnimationFade
询问状态栏显示或隐藏动画。
// This should be called whenever the return values for the view controller's status bar attributes have changed. If it is called from within an animation block, the changes will be animated along with the rest of the animation block.
- (void)setNeedsStatusBarAppearanceUpdate NS_AVAILABLE_IOS(7_0);
设置需要更新状态栏。主动调用该方法,将间接调用上述三个方法。如果需要动画生效,需:
    [UIView animateWithDuration:0.4
                     animations:^{
                         [self setNeedsStatusBarAppearanceUpdate];
                     }];
   
 

2、View controller-based status bar appearance : NO

 
UIApplication方法/属性 说明
// Setting statusBarHidden does nothing if your application is using the default UIViewController-based status bar system.
@property(nonatomic,getter=isStatusBarHidden) BOOL statusBarHidden;
- (void)setStatusBarHidden:(BOOL)hidden withAnimation:(UIStatusBarAnimation)animation NS_AVAILABLE_IOS(3_2);
设置是否隐藏状态栏。
// Setting statusBarHidden does nothing if your application is using the default UIViewController-based status bar system.
@property(nonatomic) UIStatusBarStyle statusBarStyle; // default is UIStatusBarStyleDefault
- (void)setStatusBarStyle:(UIStatusBarStyle)statusBarStyle animated:(BOOL)animated;
设置状态栏样式(UIStatusBarStyleDefault/UIStatusBarStyleLightContent)。
   
 
如果要在App启动时和运行时全程隐藏状态栏,在View controller-based status bar appearance为NO的情况下,只需简单将Status bar is initially hidden(UIStatusBarHidden)设置为YES。

六、示例代码

可以根据是否是基于ViewController的状态栏控制来决定是否调用UIApplication中控制状态栏的相关方法,也可以直接调用。因为在基于ViewController的状态栏控制时,调用UIApplication中控制状态栏的相关设置方法会被忽略。
@interface ViewController ()

@property (nonatomic) BOOL statusBarIsHidden;

@end

@implementation ViewController

- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
self.statusBarIsHidden = NO;
} - (void)didReceiveMemoryWarning {
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
} - (void)viewDidAppear:(BOOL)animated
{
[super viewDidAppear:animated]; [UIApplication sharedApplication].statusBarStyle = UIStatusBarStyleDefault; [self performSelector:@selector(setStatusBarHidden:) withObject:@(YES) afterDelay:.];
[self performSelector:@selector(setStatusBarHidden:) withObject:@(NO) afterDelay:.];
} - (void)setStatusBarHidden:(BOOL)hidden
{
self.statusBarIsHidden = hidden;
[UIView animateWithDuration:0.4
animations:^{
[self setNeedsStatusBarAppearanceUpdate];
}];
[[UIApplication sharedApplication] setStatusBarHidden:hidden withAnimation:UIStatusBarAnimationSlide];
} - (UIStatusBarStyle)preferredStatusBarStyle
{
return UIStatusBarStyleDefault;
} - (BOOL)prefersStatusBarHidden
{
return self.statusBarIsHidden;
} - (UIStatusBarAnimation)preferredStatusBarUpdateAnimation
{
return UIStatusBarAnimationSlide;
} @end
七、自定义状态栏
见参考资料:
 
 

[iOS]关于状态栏(UIStatusBar)的若干问题的更多相关文章

  1. ios上 更改 状态栏(UIStatusBar)

    摘要 ios上 更改状态栏(UIStatusBar)的颜色 ios UIStatusBar statusBar 状态栏 更改状态栏颜色 目录[-] IOS上 关于状态栏的相关设置(UIStatusBa ...

  2. ios上 更改 状态栏(UIStatusBar)的颜色,你值得一看、收藏

    IOS上 关于状态栏的相关设置(UIStatusBar) 知识普及 ios上状态栏 就是指的最上面的20像素高的部分 状态栏分前后两部分,要分清这两个概念,后面会用到: 前景部分:就是指的显示电池.时 ...

  3. IOS 状态栏(UIStatusBar)

    ios上状态栏指的屏幕顶端的20像素高的部分 状态栏分前景和背景两部分 前景部分:就是指的显示电池.时间等部分: 背景部分:就是显示白色或者图片的背景部分: 如下图:前景部分为黑色字体,背景部分为白色 ...

  4. 如何实现 iOS 自定义状态栏

    给大家介绍如何实现 iOS 自定义状态栏 Sample Code: 01 UIWindow * statusWindow = [[UIWindow alloc] initWithFrame:[UIAp ...

  5. iOS设置状态栏样式

    iOS设置状态栏样式可以使用两种方式. 方式一: 直接在需要改变默认状态栏样式的控制器中实现一个方法(其他任何事情都不用做): // 返回状态栏的样式 - (UIStatusBarStyle)pref ...

  6. iOS 更改状态栏、导航栏颜色的几种方法

    ios上状态栏 就是指的最上面的20像素高的部分状态栏分前后两部分,要分清这两个概念,后面会用到: 前景部分:就是指的显示电池.时间等部分:背景部分:就是显示黑色或者图片的背景部分: (一)设置sta ...

  7. iOS开发之状态栏UIStatusBar图标操作

    NSArray *subIcons = [[[[UIApplication sharedApplication] valueForKeyPath:@"statusBar"] val ...

  8. iOS 修改状态栏preferredStatusBarStyle不执行问题

    一.在老版本的iOS中,状态栏永远都是白色风格.而在iOS 7中,我们可以修改每个view controller中状态栏的外观.通过UIStatusBarStyle常量可以指定状态栏的内容是暗色或亮色 ...

  9. ionic ios上状态栏和app重叠解决方案

    干货文章 ·2018-03-22 01:33:01 官方issues: https://github.com/ionic-team/ionic/issues/13294 解决办法: 1.在 confi ...

随机推荐

  1. paip.提高效率---微信 手机app快速开发平台—微网络撬动大市场

    paip.提高效率---微信 手机app快速开发平台-微网络撬动大市场   手机app快速开发平台 尤其适合crm系统,呼叫中心等业务功能...    作者Attilax  艾龙,  EMAIL:14 ...

  2. 菜鸟学习WCF笔记-Address

    终结点是WCF最为核心的对象,因为它承载了所有通信功能.服务通过相应的终结点发布出来,客户端通过与之匹配的终结点对服务进行调用.终结点有地址.绑定和契约ABC三要素构成. Address  作为终结点 ...

  3. Oracle数据库建表+添加数据练习

    SQL脚本: --建表 --student表+注释 create table student( sno ) not null, sname ) not null, ssex ) not null, s ...

  4. Apache Solr查询语法

    常用: q - 查询字符串,必须的. fl - 指定返回那些字段内容,用逗号或空格分隔多个. start - 返回第一条记录在完整找到结果中的偏移位置,0开始,一般分页用. rows - 指定返回结果 ...

  5. 发布EWM RF ITS Mobile 相关服务

    发布EWM RF ITS Mobile 相关服务 TCODE:SIAC_PUBLISH_ALL_INT ~XSRFCHECK = 0 SICF 参数: ~THEME     99 ~TRANSACTI ...

  6. The main difference between Java & C++(转载)

    转载自:http://stackoverflow.com/questions/9192309/the-main-difference-between-java-c C++ supports point ...

  7. android 平台搭建

    直接到官网下载 http://developer.android.com/sdk/index.html?utm_source=weibolife

  8. Swift入门篇-基本类型(3)

    一:元组 格式 变量或常量关键字 元组变量 = ( 变量,变量, …) 说明: : 元组变量还是一个变量,只不过表现方式和其他变量不一样 :()括号里面可以放入N个变量组成 例子: import Fo ...

  9. mac os x用macport安装redis

    一.Redis简要介绍 Redis是一个开源的使用ANSI C语言编写.支持网络.可基于内存亦可持久化的日志型.Key-Value数据库,并提供多种语言的API.从2010年3月15日起,Redis的 ...

  10. Codeforces Round #379 (Div. 2) A. Anton and Danik 水题

    A. Anton and Danik 题目连接: http://codeforces.com/contest/734/problem/A Description Anton likes to play ...