0. 在哪里可以控制
既然状态来可以显示,也可以隐藏,那么在哪里控制呢。想来想去,有可能状态栏的无非就这么几个类:UIViewController、UIWindow、UIApplication,再看看头文件里的interface声明,前两者貌似没有太合适的方法。没错,就是它了,UIApplication。
@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.
这是什么意思?
我直接做下解释吧
你这么做的话,就对了!
2. 启动页面的状态栏
还有问题?是的,在应用/游戏的LaunchImage(俗称“闪屏”)页面,依然有状态栏。
找到Info.plist,加上UIStatusBarHidden,值为YES,就OK了。
3. 其它
其实状态栏相关的东西还有好多好多,这篇只是把显示和隐藏的简要整理一下。
比如从UIApplication.h中,我们还能看到UIStatusBarStyle相关的属性和方法,和隐藏/显示的控制方法类似,大同小异。
还有就是状态条中的网络加载提示,俗称“菊花加载”,也是可以根据我们的程序状况显示和隐藏的(isNetworkActivityIndicatorVisible),做好了能给用户更多指示,提高用户体验。