iOS结合导航栏的状态栏字体颜色设置

来源:互联网 发布:汽车行业的会计 知乎 编辑:程序博客网 时间:2024/05/21 03:29

本文仅提供大家参考与交流,可能会有一些错误,欢迎大家指正。Xcode版本6.3.2。
在学习iOS开发的过程中,我经常会去看一些手机上的APP,看看它们的功能和布局效果。最近在做一个电影资讯项目,项目基本都带有NavigationController ,导航栏一般很少使用系统自带的,要协调好状态栏的字体颜色和导航栏的背景颜色。我看了很多APP的状态栏颜色变化,一般跳转到偏白色界面都是黑色字体的状态栏,其他颜色都是白色字体的状态栏。状态栏字体的颜色也就这两种,这个可以查看帮助文档:

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,//这两个样式在iOS7以后不推荐使用了,建议使用UIStatusBarStyleLightContent,也就是第二种白色样式};

几种比较常用的设置状态栏的方法
1.iOS7之前采用的方法
UIApplication对象设置(需要更改plist文件中View controller-based status bar appearance选项设置为NO,默认为YES)
第一步就是取plist中把这个选项改成NO,我知道这一大串东西根本记不住!找到Supporting Files->info.plist,右键后选Add Row 就会出现第二个页面,它会提供很多属性,一直往下,最后一个就是View controller-based status bar appearance,这样就不用记这个东西了。

修改plist中的属性
当然改完这个后,你会发现并没有什么卵用。还需设置UIApplication对象,具体代码如下:

[[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleLightContent];//设置状态栏字体为白色    [[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleDefault];//设置状态栏字体为黑色

根据本人多次试验,发现这是一个极其简单粗暴的方法。一但写了这个语句,它会把整个APP的状态栏颜色都改变。如在子控制器中写了这个设置白色字体的方法,当你返回上一级控制器或者主控制器时会发现状态栏也变成了白色。
状态栏字体颜色变化示意图
如图所示,起始状态都是第①种,一旦在sub1中设置状态栏为白色,其实本质是把整个APP的状态栏都设置了白色,如②所示。
如果不想改变第一级控制器的状态栏颜色,可以在返回第一级控制器的时候,写上

- (void)viewWillAppear:(BOOL)animated {    [super viewWillAppear:animated];    [[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleDefault];//设置状态栏字体为黑色    NSLog(@"视图将要出现");}

这样就实现了③的效果,其实本质就是将整个APP 的颜色按照显示的页面来改变。
2.iOS7以后采用的方法
在试图控制器中重写- (UIStatusBarStyle)preferredStatusBarStyle方法。该方法返回是一个UIStatusBarStyle,只要重写该方法,当前视图控制器的状态栏颜色就会改变,例如模态视图。
这个方法看似简单,但是要想在导航控制器中使用,还是要注意很多细节。因为很多APP的中都是有导航栏的,这也是导航栏跟状态栏一起讲解的原因。
先简单介绍一下UINavigationController,刚接触这个的时候,都是大概能懂,大概能用,真的要融会贯通还是有很大的难度。
NavigationController示意图
一个导航控制器,只有一个NavigationBar,注意,是一个!!我刚开始学的时候也不理解,这里我用分级来讲一下导航控制器。首先由NavigationController创建的视图肯定是第一级,后面可以通过 push操作进入下一级,我们经常发现,第一级和第二级的导航栏明明不一样,上面的按钮和标题都不一样,怎么可能是同一个导航栏?
上图中很好的阐述了为什么导航栏会不一样,如果是在同一个导航控制器种的,那么导航栏就只有一个,不同的只是UINavigationItem,以及标题,和对应的UIViewController。
那么要通过- (UIStatusBarStyle)preferredStatusBarStyle方法能不能设置同一个NavigationController里的不同的UIViewController的状态栏字体颜色呢,答案是不能!这个跟第一种“iOS7以前的方法”类似,要么全部改变,要么不改变,所以想达到设置不同的状态栏字体颜色的效果,要在返回到上一级视图时再次设置回原来的状态栏。
其实一般也没这么麻烦,同一个NavigationController就是同一个NavigationBar,的同一个导航栏的背景是固定的(如果你还想要设置不同的状态栏,建议再去开辟一个新的NavigationController,别再同一个里面,好乱~@_@)。比如我的状态栏背景图片是黑色的(微信),蓝色的(QQ),微博(白色),很少会变的。
直接在子控制器中调用这个方法是无效的。在哪里调用- (UIStatusBarStyle)preferredStatusBarStyle方法成了关键问题,肯定是在子类化UINavigationController中的导航控制器中调用,这样就OK了。

- (UIStatusBarStyle)preferredStatusBarStyle {    return UIStatusBarStyleLightContent;}

3.设置导航栏的背景颜色来改变
前两种方法是可以不通过导航栏来设置状态栏字体颜色。这里介绍的这个方法也是简单粗暴,同样是在同一个UINavigationController中,

self.navigationController.navigationBar.barStyle = UIBarStyleBlack

这条代码的意思是:将当前的导航控制器的导航栏的导航栏风格 设置为 黑色风格。关于导航栏的风格其实也就两种:

typedef NS_ENUM(NSInteger, UIBarStyle) {    UIBarStyleDefault          = 0,//默认是这种,就是有点白色的    UIBarStyleBlack            = 1,//黑色    UIBarStyleBlackOpaque      = 1, // Deprecated. Use UIBarStyleBlack 不建议使用    UIBarStyleBlackTranslucent = 2, // Deprecated. Use UIBarStyleBlack and set the translucent property to YES 不建议使用};

设置导航栏风格苹果还是挺人性化的,你既然把我的导航栏设置成黑色,我状态栏默认也是黑色,那不行,你得帮我把状态栏改成白色。大笑 这个语句在子控制器中也可以调用,只要调的到navigationBar的地方都可以修改。还是跟以前的一样,要么不改,要么就把状态栏都改了,其实这句话本身也有问题,因为导航栏和导航控制器本来就只有一个,无所谓改全部还是改单个。再次强调一遍,导航栏只有一个!!!!

关于跟导航栏相关的状态栏字体颜色设定就讲到这里,总结一下这三种方法:
第一种:要设置plist,设置完后还要写代码,略麻烦。
第二种:比较实用,毕竟是iOS7以后的新方法,虽然可以在任何UIViewController用在导航控制器的时候要注意必须写在导航控制器中。
第三种:很简单粗暴,不会影响导航栏添加背景图片。
其中肯定有很多的不足,望大家去其糟粕,取其精华(也没有啥精华~),谢谢!

0 0
原创粉丝点击