状态栏和控制器的3个方法

说了很多难懂的东西,究竟如何自定义任意一个VC的状态栏前景颜色呢?
我机智的把结果放到最前面,后面自己的摸索过程,想看的可以看看,估计你们也没有兴趣哈哈.

想要任意修改一个vc(非navigationController得子控制器)的状态栏 需要
1-info.plist中 UIViewControllerBasedStatusBarAppearance 要设置YES
2-vc和上面的vc们的setNeedsStatusBarAppearanceUpdate方法不super

Paste_Image.png

或者干脆不重写setNeedsStatusBarAppearanceUpdate方法 (大家一般是不会重写的,哈哈,所以这条基本可以忽略了)
3-然后还需要修改prefer方法中的UIStatusBarStyle(就是立即刷新之前要修改内容才可以)
4-然后调用setNeedsStatusBarAppearanceUpdate方法(条件都满足了 最后就update)

Paste_Image.png
Paste_Image.png
Paste_Image.png

想要任意修改一个vc(navigationController得子控制器)的状态栏 需要
1.navVC重写childViewControllerForStatusBarStyle方法如下返回栈顶控制器
- (UIViewController *)childViewControllerForStatusBarStyle {
return self.topViewController;
}
2.在子控制器重写prefer方法,返回设定的style

有没有不区分是否是navigationController的通用设定vc的状态栏前景的方法呢?
采用iOS9过期的方法

  • (void)setStatusBarStyle:(UIStatusBarStyle)statusBarStyle animated:(BOOL)animated NS_DEPRECATED_IOS(2_0, 9_0, "Use -[UIViewController preferredStatusBarStyle]") __TVOS_PROHIBITED;(要用新的代替参考上面区分是否被navigationController持有)

1.info.plist中 UIViewControllerBasedStatusBarAppearance 要设置NO

2.viewWillAppear方法中调用[[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleLightContent animated:YES];

3.viewWillDisappear方法中调用[[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleDefault animated:YES];

appdelegate.m navigationController.m 和scanCodeController.m 都重写了preferredStatusBarStyle方法View controller-based status bar appearance 设为YES只会走[JWKNavigationController preferredStatusBarStyle]View controller-based status bar appearance 设为NO哪个也不走(其实appdelegate 重写没鸟用,根本就是控制器的方法!)
在info.plist中增加了Status bar style,那么启动就是这个样式,而且target中的数据也会随之改变.

Paste_Image.png
Paste_Image.png

View controller-based status bar appearance 默认是 NO 就是说在vc中重写preferredStatusBarStyle不生效.View controller-based status bar appearance YES,vc重写preferredStatusBarStyle 才会生效;[self setNeedsStatusBarAppearanceUpdate]可以立即调用preferredStatusBarStyle

Paste_Image.png

当我们调用setNeedsStatusBarAppearanceUpdate时,系统会调用self(谁调用的这个方法,就执行谁的)的preferredStatusBarStyle方法.- (UIViewController *)childViewControllerForStatusBarStyle:这个接口也很重要,默认返回值为nil


Paste_Image.png

如果在vc中重写了setNeedsStatusBarAppearanceUpdate,里面什么也没干的话,vc modal出下一个控制器三个方法都不会调用,而且肯定的是vc即将disAppear的时候会自动调用setNeedsStatusBarAppearanceUpdate一次.但是rootVC显示时候,三个方法都会调用,先调用setNeedsStatusBarAppearanceUpdate,然后childViewControllerForStatusBarStyle,最后preferredStatusBarStyle
- (void)setNeedsStatusBarAppearanceUpdate {// [super setNeedsStatusBarAppearanceUpdate];}
特殊如果modal的是navigationController 会先调用navigationController的setNeedsStatusBarAppearanceUpdate方法一次,然后再调用该控制器的setNeedsStatusBarAppearanceUpdate方法一次.navigationController的跟控制器的三个方法还是不调用.如果navigationController的rootVC dismiss的话,不调用navigationController和rootVC的三个方法反而会调用modal出navigationController的控制器的setNeedsStatusBarAppearanceUpdate方法.然后rootVC和navigationController都会dealloc当控制器即将销毁的时候 是不会调用控制器的三个方法的.如果只有一个rootVC的navVC modal出另一个控制器(navVC还是一个子控制器),只会调用navVC的setNeedsStatusBarAppearanceUpdate方法1次,这个新的modal出来的控制器 dismiss的时候,也是只会调用navVC的setNeedsStatusBarAppearanceUpdate方法1次.如果a控制器 modal出来navVC NACVC下面的子控制器中 任意一个子控制器 dismiss,就会直接跳转到a控制器,navVC 和 它的子控制器都会销毁.如果navVc的a控制器 push b控制器时候,只会调用navVC的setNeedsStatusBarAppearanceUpdate方法1次, 同样点击pop b控制器,只会调用navVC的setNeedsStatusBarAppearanceUpdate方法1次.如果项目的根控制器重写方法 调用super的方法- (void)setNeedsStatusBarAppearanceUpdate { NSLog(@"%s",func); [super setNeedsStatusBarAppearanceUpdate];}modal的first控制器没有调用super方法结果是

Paste_Image.png

会调用first的childViewControllerForStatusBarStyle和preferredStatusBarStyle,而不会调用setNeedsStatusBarAppearanceUpdate,当first要modal出second控制器时候才会调用setNeedsStatusBarAppearanceUpdate.也就是只要控制器被掩盖压栈,都会调用setNeedsStatusBarAppearanceUpdate 1次,和之前的情况是一样的.只要调用childViewControllerForStatusBarStyle,就会调用preferredStatusBarStyle方法.然后first modal second 结果如下

Paste_Image.png

由于first没有 super,所以只会调用first 的 setNeedsStatusBarAppearanceUpdate,不会向上追溯setNeedsStatusBarAppearanceUpdate,也不会往下调用second的两个个方法.setNeedsStatusBarAppearanceUpdate 是否super 决定了 1.是否向上追溯前面的控制器这个方法 2.是否向下调用栈顶控制器2个方法如果 rootVC和firstVC 都调用了super,结果如下

Paste_Image.png

a modal b的时候,会先调用a的setNeedsStatusBarAppearanceUpdate,然后再调用rootVC的setNeedsStatusBarAppearanceUpdate方法.setNeedsStatusBarAppearanceUpdate 具有向上追溯性当从 b dismiss 到 a 结果如下

Paste_Image.png

不仅仅会 调用 a 和 rootVC的setNeedsStatusBarAppearanceUpdate,还会调用a的childViewControllerForStatusBarStyle和preferredStatusBarStyle方法.再继续从a dismiss 到 rootVC 结果如下不仅仅会 调用rootVC的setNeedsStatusBarAppearanceUpdate,还会调用rootVC的childViewControllerForStatusBarStyle和preferredStatusBarStyle方法.

Paste_Image.png

只要vc 调用了 super 那么 vc dismiss的时候就会调用 上一级vc 直到rootVC的setNeedsStatusBarAppearanceUpdate方法,然后再调用上一级vc的childViewControllerForStatusBarStyle和preferredStatusBarStyle方法.实现调用super setNeedsStatusBarAppearanceUpdate dismiss会调用 上层vc们的setNeedsStatusBarAppearanceUpdate 和 上一级vc的childViewControllerForStatusBarStyle和preferredStatusBarStyle方法. 但是如果上级没有super,就不会调用上一级的childViewControllerForStatusBarStyle和preferredStatusBarStyle方法rootVC 和 first super了,second没有super,一路modal过来 结果如下

Paste_Image.png

会调用三个控制器的childViewControllerForStatusBarStyle和preferredStatusBarStyle方法再往下modal navigationController带着third 两个都super,也就是只有second没有super,结果如下

Paste_Image.png

没有调用navigationController和third的childViewControllerForStatusBarStyle或者preferredStatusBarStyle方法说明前面的控制器都super了,向下modal 就会调用下一级vc的 childViewControllerForStatusBarStyle和preferredStatusBarStyle方法,如果前面一级没有super,那么后面一级就不会调用这个两个方法了.反过来向前dismiss时候, 本级和之前的vc都super了,下一级dismiss到本级才会调用本级的childViewControllerForStatusBarStyle和preferredStatusBarStyle方法也就是说childViewControllerForStatusBarStyle和preferredStatusBarStyle方法要想被调用,必须确保前面的vc们都super了(向下modal,不用管下一级,向上dismiss,也不用管本级是否 super)如果rootVC 不调用super 那么后面的vc都不会调用childViewControllerForStatusBarStyle和preferredStatusBarStyle方法.

Paste_Image.png

从 b dismiss 到 a 到 rootVC的结果如下,都不会调用childViewControllerForStatusBarStyle和preferredStatusBarStyle方法.

Paste_Image.png

navVC没有 super fourth/fifth也没有super 一直modal+push到fourth结果如下

Paste_Image.png

修改navVC super 但是fourth/fifth还没有super 一直modal+push到fourth结果如下

Paste_Image.png

在往下modal fifth 结果如下

Paste_Image.png

从 fifth 往上 dismiss到fourth 结果如下

Paste_Image.png

从 fifth dismiss 到second 结果如下

Paste_Image.png

从 fifth pop到third 结果如下'

Paste_Image.png

从 third dismiss 到 second 结果如下

Paste_Image.png

修改navVC super 但是third/fourth/fifth还没有super 一直modal+push到fourth结果如下

Paste_Image.png

和前面third super的调用时一样的从 fifth dismiss 到 fourth 在pop到third 再dismiss到second 结果如下

Paste_Image.png

和前面third super的调用时一样的从 fifth dismiss 到 fourth 再dismiss到second 结果如下

Paste_Image.png

和前面third super的调用时一样的navigationContrller的子控制器 不具备单独的承接能力,以navigationControllr 的是否super 为准因此可以在navigationController的这个方法中处理 判断 比如指定topViewController为某个类的时候,才能采用return self.topViewController,否则return nil-->调用navigationController自己的preferredStatusBarStyle方法

Paste_Image.png

总结一下
View controller-based status bar appearance 默认是 NO,要修改为YES,设置控制的三个方法,才可以生效.一般来说preferredStatusBarStyle方法被调用是因为childViewControllerForStatusBarStyle被调用在先.childViewControllerForStatusBarStyle调用情况是前面的vc们setNeedsStatusBarAppearanceUpdate要super.setNeedsStatusBarAppearanceUpdate方法被调用是rootVC刚显示和vc被压栈(压栈的时候具有追溯性-->rootVC)当vc要被销毁 三个方法都不走

设置statusBar的【背景部分】1.navigationBar的setBarTintColor接口,用此接口可改变statusBar的背景色 blackColor就是纯黑色

Paste_Image.png

2.可以通过以下设置:self.navigationController.navigationBar.barStyle = UIBarStyleBlack将导航条背景样式设为黑色 不是纯黑

Paste_Image.png
Paste_Image.png
Paste_Image.png

会导致setNeedsStatusBarAppearanceUpdate调用两次

Paste_Image.png

正常是只调用1次的 在modal出navigationController的时候

Paste_Image.png

在navigationController子控制器中强调child方法不会继续调用prefer方法的.

Paste_Image.png

在navigationController子控制器中强调prefer方法不会生效改变状态栏的颜色,动一下键盘还会调用两遍navVC的childViewControllerForStatusBarStyle 和preferredStatusBarStyle 方法

Paste_Image.png

参考文章:
https://my.oschina.net/shede333/blog/304560
http://www.jianshu.com/p/25e9c1a864be
http://www.jianshu.com/p/ee1c9c91a477
http://www.jianshu.com/p/fa8d87625906
http://stackoverflow.com/questions/19022210/preferredstatusbarstyle-isnt-called/19513714#19513714
http://stackoverflow.com/questions/17678881/how-to-change-status-bar-text-color-in-ios-7#comment28947732_17768797
http://stackoverflow.com/questions/17678881/how-to-change-status-bar-text-color-in-ios-7

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,029评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,395评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,570评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,535评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,650评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,850评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,006评论 3 408
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,747评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,207评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,536评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,683评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,342评论 4 330
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,964评论 3 315
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,772评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,004评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,401评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,566评论 2 349

推荐阅读更多精彩内容