iOS控件:状态栏

有些话、适合烂在心里 提交于 2019-12-02 14:09:51

由于iOS 7 SDK较早期版本的SDK改动较大,因此App的界面也会出现种种问题,其中最明显的问题就是状态栏与导航栏的显示问题。

一、状态栏

iOS 6:



iOS7: 



当未使用导航栏时,上面的截图对比了在iOS 6与iOS 7上的显示情况。iOS 6中的状态栏不透明,视图控制器的主视图原点在状态栏下面。而iOS 7的状态栏背景色变为透明色,视图控制器的主视图原点在屏幕左上角,即状态栏显示在主视图之上,透过状态栏可以显示视图的内容。

如下图将视图的坐标设置为CGRectMake(0, 0, 300, 40)的效果如下


iOS 7提供了两种状态栏的样式,用于控制状态栏文字的颜色。

typedef NS_ENUM(NSInteger, UIStatusBarStyle)  
{  
    UIStatusBarStyleDefault                                     = 0, // Dark content, for use on light backgrounds  
    UIStatusBarStyleLightContent     NS_ENUM_AVAILABLE_IOS(7_0) = 1, // Light content, for use on dark backgrounds  
      
    UIStatusBarStyleBlackTranslucent NS_ENUM_DEPRECATED_IOS(2_0, 7_0, "Use UIStatusBarStyleLightContent") = 1,  
    UIStatusBarStyleBlackOpaque      NS_ENUM_DEPRECATED_IOS(2_0, 7_0, "Use UIStatusBarStyleLightContent") = 2,  
};  

如果状态栏背景为浅色,应选用黑色字样式(UIStatusBarStyleDefault,默认值);如果背景为深色,则选用白色字样式(UIStatusBarStyleLightContent)。

二、隐藏状态栏

iOS7之前和iOS之后隐藏状态栏的方法是不同的。

第一种:

iOS7之前使用:

//iOS7以下版本隐藏UIStatusBar的方法:
   [[UIApplication sharedApplication] setStatusBarHidden:YES withAnimation:UIStatusBarAnimationFade];
    //PS:
    //UIStatusBarAnimationNone  //没有动画效果
    //UIStatusBarAnimationFade  //淡出
    //UIStatusBarAnimationSlide //滑动

iOS7及之后使用:

PS:这里需要说明的是:

1、控制器不在导航栈或者在导航栈但导航条隐藏的状态下,下面的两个方法才会都被调用,

2、在导航栈有导航条的时候只有prefersStatusBarHidder方法会调用,preferredStatusBarStyle不会调用

总结一下就是有导航条preferredStatusBarStyle不调用,没有导航条preferredStatusBarStyle调用。

思考:怎么再有导航条的情况下改变状态栏的UIStatusBarStyle呢?

//升级到iOS7后的方法:
//在基类中重载UIViewController.h中的这个方法:
-(BOOL)prefersStatusBarHidden{
    return NO;
}
//可同时重载此方法来设置状态栏的样式
-(UIStatusBarStyle)preferredStatusBarStyle{
//    UIStatusBarStyleDefault//黑色
//    UIStatusBarStyleLightContent//白色
//    UIStatusBarStyleBlackTranslucent
//    UIStatusBarStyleBlackOpaque
    return UIStatusBarStyleDefault;
}

PS:在需要适配iOS7之前和iOS7及之后的版本,需要对系统版本做判断并选择不同的方法。

第二种:

另外一种方法是改变info.plist文件内容来达到设置状态栏是否隐藏如下图


info.plist文件中,

View controller-based status bar appearance项设为NO, 则以application的设置为准,view controller的prefersStatusBarHidden方法无效,是根本不会被调用的。
View controller-based status bar appearance项设为YES,则以View controller的prefersStatusBarHidden为准,application的设置无效,不会调用。

如果想要兼容iOS7之前、iOS7及之后:

View controller-based status bar appearance项设为NO,并用application来设置即可

[[UIApplication sharedApplication] setStatusBarHidden:YES withAnimation:UIStatusBarAnimationFade];//隐藏状态栏
[[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleLightContent animated:YES];//状态栏存在条件下,改变字体颜色

PS:通过此种方法,不管导航条是否存在,都能够改变状态栏的字体颜色

思考:View controller-based status bar appearance项设为YES 且有导航条的条件下,如何改变状态栏的字体颜色?

暂时还没找到方法。




参考文章:

1、         控制iOS 7中的状态栏                     

2、         iOS7下隐藏statusbar                     

3、         UINavgationController中覆写preferredStatusBarStyle方法不执行的问题                     文章中改变状态栏颜色的方法有问题。

4、         iOS如何把所有界面的状态栏的字体颜色都设置为白色                     


易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!