美文网首页Swift&Objective-C
iOS中关于NavigationController中UISta

iOS中关于NavigationController中UISta

作者: 7eefdf8a9783 | 来源:发表于2019-10-25 15:34 被阅读0次

    版权声明:本文为CSDN博主「Deft_MKJing宓珂璟」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。

    原文链接:https://blog.csdn.net/deft_mkjing/article/details/51705021

    介绍

    这效果简直要了我的老命啊,在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的前景,稍微带一下背景吧

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

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

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

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

    ————————————————

    相关文章

      网友评论

        本文标题:iOS中关于NavigationController中UISta

        本文链接:https://www.haomeiwen.com/subject/crnsvctx.html