iOS中关于NavigationController中UIStatusBar黑白切换以及preferredStatusBarStyle一直不执行的问题

介绍

这效果简直要了我的老命啊,在StackOverFlow上看遍了所有的回答,你们先感受下我的心情

      

这回答,试了下,不行啊


再来看看另一个,可以是可以,不过我要iOS 7以上的那个新方法啊

      


再换一个,没错,就是这个了,虽然票数少,但是就是你了

    



1.介绍第一种做法,比较简单粗暴(但是貌似被iOS 9给废掉了)


不过这种都不是问题,可以看一下Apple对已经废弃的方法是如何处理的

翻译文章

原文章链接

还是介绍下 使用UIApplication的statusBarStyle方法来设置状态栏,不过,首先要停止使用View Controller - based status bar appearance。在project target的info plist中插入一个新的key,View controller-based status bar appearance,将其设置为NO


然后就可以用刚才能废弃的方法进行修改了


我去啊,这什么鬼啊,怎么那么白,白的都看不到了,各位将就下吧,差不多就这个效果了




2.介绍第二种做法,哎呦,这个厉害了啊,不过这真的搞死我了,先普及下调用方法的知识

给个老外的解释,英文好的自己去看

https://www.kurutepe.com/2013/11/view-controller-containers-and-status-bar-style/

给大伙分析下

- (UIStatusBarStyle)preferredStatusBarStyle

在需要的控制器里面重写这个方法,返回值就是UIStatusBarStyleDefault或者UIStatusBarStyleLightContent

在该方法里面,如果只是简单的返回值而已,那么该界面在显示的时候会立马改变StatusBar的前景部分

如果该VC已经显示出来了,你需要做的就是根据滚动的偏移量在实时更改StatusBar的前景颜色,那么你就要用到

[self setNeedsStatusBarAppearanceUpdate]来显视调用preferredStatusBarStyle这个方法才能更改StatusBar

的颜色


然而这个时候坑来了,你以为这样设置好就完了么,他就会调用了么,你真的是too young too naive

          

最关键的东西来了

- (UIViewController *)childViewControllerForStatusBarStyle:

为什么要重写这个东西呢

这个方法默认返回值是nil。也就是当我们调用setNeedsStatusBarAppearanceUpdate的时候,系统会调用container(容器控制器)的preferredStatusBarStyle这个方法(app.window.rootViewController的preferred的方法,一般我们用UINavigationController或者UITabBarController来做container),也就是根本不会调用子控制器(我们所看到的UIViewcontroller)的preferredStatusBarStyle方法。这个时候- (UIViewController *)childViewControllerForStatusBarStyle:就派上用场了


给UINavigationController写一个Catogory,implementation如下,然后记得在需要的界面包含头文件就行


该类扩展的意思就是,我重写了,你不要调用Container(NavigationController或者UITabBarController)的preferredStatusBarStyle这个方法了,去调用self.visibleViewController的preferredStatusBarStyle,那么,我们写在UIViewcontroller里面的方法就会被调用了,就能更改StatusBar的前景颜色了


总结:

只要UIViewController重写的childViewControllerForStatusBarStyle返回值不是nil,那么UIViewcontroller的preferredStatusBarStyle方法不会被系统的Container(NavigationController或者UITabBarController)调用,而是调用childViewControllerForStatusBarStyle返回的UIViewController的preferredStatusBarStyle来控制StatuBar的颜色


听不明白没关系,你遇到你就知道了,这真的有点坑

你以为这就完了么???跑起来


                                          


这东西真的尴尬了我很久,我辛辛苦苦找了大半年的资料,竟然一点反应都没有

最后试着把这货改了


再跑起来


                              


既然介绍了StatusBar的前景,稍微带一下背景吧

navigationBarsetBarTintColor接口,可以用此接口可改变statusBar的背景色

但是有个方法需要注意的是:

一旦你调用了navigationBar- (void)setBackgroundImage:(UIImage *)backgroundImage forBarMetrics:(UIBarMetrics)barMetrics接口,那么上面的setBarTintColor接口就不能改变statusBar的背景色,statusBar的背景色就会变成纯黑色

那么咱们可以在UINavigationBar上addSubView,这个View就可以自己定义了,大小和原生的一样就OK了


这东西折腾了我很久,拿出来记录下,希望大家别被坑了

Demo



  • 3
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 7
    评论
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值