再说说iOS的状态栏(显示与隐藏)

在今年早些时候,整理了一篇由于iOS7中状态栏对布局影响的文章,即状态栏不占高度,可与页面实际内容(origin.y为0)相重叠。在有些情况下,比如在某款游戏中,我们不希望在游戏页面看到状态栏,一来是为了省地方,二来也避免状态栏“破坏气氛”。这篇文章就整理下状态栏隐藏和显示相关的内容。

0. 在哪里可以控制

既然状态来可以显示,也可以隐藏,那么在哪里控制呢。想来想去,有可能状态栏的无非就这么几个类:UIViewController、UIWindow、UIApplication,再看看头文件里的interface声明,前两者貌似没有太合适的方法。没错,就是它了,UIApplication。

从UIApplication.h中,我们看来看去也就这么3个和状态栏的隐藏有关:

@property(nonatomic,getter=isStatusBarHidden) BOOL statusBarHidden;
- (void)setStatusBarHidden:(BOOL)hidden withAnimation:(UIStatusBarAnimation)animation NS_AVAILABLE_IOS(3_2);
- (void)setStatusBarHidden:(BOOL)hidden animated:(BOOL)animated NS_DEPRECATED_IOS(2_0, 3_2);

其中第一个是一个BOOL类型的属性,第二个和第三个都是带有动画控制的方法。

可以想象到,不带动画的属性设置就是很直观的消失或者出现。即设置UIApplication对象的statusBarHidden为YES或NO。

而从第二个和第三个方式中,我们看到了iOS SDK API的更新变化:

  • - (void)setStatusBarHidden:(BOOL)hidden animated:(BOOL)animated NS_DEPRECATED_IOS(2_0, 3_2);  从后面的标记看出,是从iOS2.0开始支持,而到3.2就开始不推荐使用,算是过时的了。这个方法除了设置隐藏还是显示的参数外,还提供了是否有动画效果的参数。
  • - (void)setStatusBarHidden:(BOOL)hidden withAnimation:(UIStatusBarAnimation)animation NS_AVAILABLE_IOS(3_2); 而这个标记,则刚好是一个接班,从iOS3.2开始,可以使用此方法。提供的动画参数不再是简单的BOOL值,而是一个枚举值,可以选择几种动画效果,目前对于隐藏动作有淡出和向上滑出两种效果。

1. 没有生效?

也许你已经尝试按照上面的三种方案对状态栏的隐藏和显示做处理了,但发现毫无反应,原来显示的依然在那里,原来就不可见的现在仍然没有出现。

还是回头仔细看看UIApplication.h的注释吧:

// Setting statusBarHidden does nothing if your application is using the default UIViewController-based status bar system.

这是什么意思?

我直接做下解释吧:

statusBarHiddenInfoplist

你这么做的话,就对了!

2. 启动页面的状态栏

还有问题?是的,在应用/游戏的LaunchImage(俗称“闪屏”)页面,依然有状态栏。

找到Info.plist,加上UIStatusBarHidden,值为YES,就OK了。

3. 其它

其实状态栏相关的东西还有好多好多,这篇只是把显示和隐藏的简要整理一下。

比如从UIApplication.h中,我们还能看到UIStatusBarStyle相关的属性和方法,和隐藏/显示的控制方法类似,大同小异。

还有就是状态条中的网络加载提示,俗称“菊花加载”,也是可以根据我们的程序状况显示和隐藏的(isNetworkActivityIndicatorVisible),做好了能给用户更多指示,提高用户体验。

这篇就说到这里。

相关文章:

此条目发表在 iOS 分类目录,贴了 , , , 标签。将固定链接加入收藏夹。

再说说iOS的状态栏(显示与隐藏)》有 1 条评论

  1. Pingback 引用通告: iOS7之后的各种bar和布局 | 三石·道

发表评论

电子邮件地址不会被公开。 必填项已用 * 标注

您可以使用这些 HTML 标签和属性: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>