狀態(tài)欄和控制器的3個(gè)方法

說了很多難懂的東西,究竟如何自定義任意一個(gè)VC的狀態(tài)欄前景顏色呢?
我機(jī)智的把結(jié)果放到最前面,后面自己的摸索過程,想看的可以看看,估計(jì)你們也沒有興趣哈哈.

想要任意修改一個(gè)vc(非navigationController得子控制器)的狀態(tài)欄 需要
1-info.plist中 UIViewControllerBasedStatusBarAppearance 要設(shè)置YES
2-vc和上面的vc們的setNeedsStatusBarAppearanceUpdate方法不super

Paste_Image.png

或者干脆不重寫setNeedsStatusBarAppearanceUpdate方法 (大家一般是不會(huì)重寫的,哈哈,所以這條基本可以忽略了)
3-然后還需要修改prefer方法中的UIStatusBarStyle(就是立即刷新之前要修改內(nèi)容才可以)
4-然后調(diào)用setNeedsStatusBarAppearanceUpdate方法(條件都滿足了 最后就update)

Paste_Image.png
Paste_Image.png
Paste_Image.png

想要任意修改一個(gè)vc(navigationController得子控制器)的狀態(tài)欄 需要
1.navVC重寫childViewControllerForStatusBarStyle方法如下返回棧頂控制器
- (UIViewController *)childViewControllerForStatusBarStyle {
return self.topViewController;
}
2.在子控制器重寫prefer方法,返回設(shè)定的style

有沒有不區(qū)分是否是navigationController的通用設(shè)定vc的狀態(tài)欄前景的方法呢?
采用iOS9過期的方法

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

1.info.plist中 UIViewControllerBasedStatusBarAppearance 要設(shè)置NO

2.viewWillAppear方法中調(diào)用[[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleLightContent animated:YES];

3.viewWillDisappear方法中調(diào)用[[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleDefault animated:YES];

appdelegate.m navigationController.m 和scanCodeController.m 都重寫了preferredStatusBarStyle方法View controller-based status bar appearance 設(shè)為YES只會(huì)走[JWKNavigationController preferredStatusBarStyle]View controller-based status bar appearance 設(shè)為NO哪個(gè)也不走(其實(shí)appdelegate 重寫沒鳥用,根本就是控制器的方法!)
在info.plist中增加了Status bar style,那么啟動(dòng)就是這個(gè)樣式,而且target中的數(shù)據(jù)也會(huì)隨之改變.

Paste_Image.png
Paste_Image.png

View controller-based status bar appearance 默認(rèn)是 NO 就是說在vc中重寫preferredStatusBarStyle不生效.View controller-based status bar appearance YES,vc重寫preferredStatusBarStyle 才會(huì)生效;[self setNeedsStatusBarAppearanceUpdate]可以立即調(diào)用preferredStatusBarStyle

Paste_Image.png

當(dāng)我們調(diào)用setNeedsStatusBarAppearanceUpdate時(shí)减俏,系統(tǒng)會(huì)調(diào)用self(誰調(diào)用的這個(gè)方法,就執(zhí)行誰的)的preferredStatusBarStyle方法.- (UIViewController *)childViewControllerForStatusBarStyle:這個(gè)接口也很重要归苍,默認(rèn)返回值為nil


Paste_Image.png

如果在vc中重寫了setNeedsStatusBarAppearanceUpdate,里面什么也沒干的話,vc modal出下一個(gè)控制器三個(gè)方法都不會(huì)調(diào)用,而且肯定的是vc即將disAppear的時(shí)候會(huì)自動(dòng)調(diào)用setNeedsStatusBarAppearanceUpdate一次.但是rootVC顯示時(shí)候,三個(gè)方法都會(huì)調(diào)用,先調(diào)用setNeedsStatusBarAppearanceUpdate,然后childViewControllerForStatusBarStyle,最后preferredStatusBarStyle
- (void)setNeedsStatusBarAppearanceUpdate {// [super setNeedsStatusBarAppearanceUpdate];}
特殊如果modal的是navigationController 會(huì)先調(diào)用navigationController的setNeedsStatusBarAppearanceUpdate方法一次,然后再調(diào)用該控制器的setNeedsStatusBarAppearanceUpdate方法一次.navigationController的跟控制器的三個(gè)方法還是不調(diào)用.如果navigationController的rootVC dismiss的話,不調(diào)用navigationController和rootVC的三個(gè)方法反而會(huì)調(diào)用modal出navigationController的控制器的setNeedsStatusBarAppearanceUpdate方法.然后rootVC和navigationController都會(huì)dealloc當(dāng)控制器即將銷毀的時(shí)候 是不會(huì)調(diào)用控制器的三個(gè)方法的.如果只有一個(gè)rootVC的navVC modal出另一個(gè)控制器(navVC還是一個(gè)子控制器),只會(huì)調(diào)用navVC的setNeedsStatusBarAppearanceUpdate方法1次,這個(gè)新的modal出來的控制器 dismiss的時(shí)候,也是只會(huì)調(diào)用navVC的setNeedsStatusBarAppearanceUpdate方法1次.如果a控制器 modal出來navVC NACVC下面的子控制器中 任意一個(gè)子控制器 dismiss,就會(huì)直接跳轉(zhuǎn)到a控制器,navVC 和 它的子控制器都會(huì)銷毀.如果navVc的a控制器 push b控制器時(shí)候,只會(huì)調(diào)用navVC的setNeedsStatusBarAppearanceUpdate方法1次, 同樣點(diǎn)擊pop b控制器,只會(huì)調(diào)用navVC的setNeedsStatusBarAppearanceUpdate方法1次.如果項(xiàng)目的根控制器重寫方法 調(diào)用super的方法- (void)setNeedsStatusBarAppearanceUpdate { NSLog(@"%s",func); [super setNeedsStatusBarAppearanceUpdate];}modal的first控制器沒有調(diào)用super方法結(jié)果是

Paste_Image.png

會(huì)調(diào)用first的childViewControllerForStatusBarStyle和preferredStatusBarStyle,而不會(huì)調(diào)用setNeedsStatusBarAppearanceUpdate,當(dāng)first要modal出second控制器時(shí)候才會(huì)調(diào)用setNeedsStatusBarAppearanceUpdate.也就是只要控制器被掩蓋壓棧,都會(huì)調(diào)用setNeedsStatusBarAppearanceUpdate 1次,和之前的情況是一樣的.只要調(diào)用childViewControllerForStatusBarStyle,就會(huì)調(diào)用preferredStatusBarStyle方法.然后first modal second 結(jié)果如下

Paste_Image.png

由于first沒有 super,所以只會(huì)調(diào)用first 的 setNeedsStatusBarAppearanceUpdate,不會(huì)向上追溯setNeedsStatusBarAppearanceUpdate,也不會(huì)往下調(diào)用second的兩個(gè)個(gè)方法.setNeedsStatusBarAppearanceUpdate 是否super 決定了 1.是否向上追溯前面的控制器這個(gè)方法 2.是否向下調(diào)用棧頂控制器2個(gè)方法如果 rootVC和firstVC 都調(diào)用了super,結(jié)果如下

Paste_Image.png

a modal b的時(shí)候,會(huì)先調(diào)用a的setNeedsStatusBarAppearanceUpdate,然后再調(diào)用rootVC的setNeedsStatusBarAppearanceUpdate方法.setNeedsStatusBarAppearanceUpdate 具有向上追溯性當(dāng)從 b dismiss 到 a 結(jié)果如下

Paste_Image.png

不僅僅會(huì) 調(diào)用 a 和 rootVC的setNeedsStatusBarAppearanceUpdate,還會(huì)調(diào)用a的childViewControllerForStatusBarStyle和preferredStatusBarStyle方法.再繼續(xù)從a dismiss 到 rootVC 結(jié)果如下不僅僅會(huì) 調(diào)用rootVC的setNeedsStatusBarAppearanceUpdate,還會(huì)調(diào)用rootVC的childViewControllerForStatusBarStyle和preferredStatusBarStyle方法.

Paste_Image.png

只要vc 調(diào)用了 super 那么 vc dismiss的時(shí)候就會(huì)調(diào)用 上一級vc 直到rootVC的setNeedsStatusBarAppearanceUpdate方法,然后再調(diào)用上一級vc的childViewControllerForStatusBarStyle和preferredStatusBarStyle方法.實(shí)現(xiàn)調(diào)用super setNeedsStatusBarAppearanceUpdate dismiss會(huì)調(diào)用 上層vc們的setNeedsStatusBarAppearanceUpdate 和 上一級vc的childViewControllerForStatusBarStyle和preferredStatusBarStyle方法. 但是如果上級沒有super,就不會(huì)調(diào)用上一級的childViewControllerForStatusBarStyle和preferredStatusBarStyle方法rootVC 和 first super了,second沒有super,一路modal過來 結(jié)果如下

Paste_Image.png

會(huì)調(diào)用三個(gè)控制器的childViewControllerForStatusBarStyle和preferredStatusBarStyle方法再往下modal navigationController帶著third 兩個(gè)都super,也就是只有second沒有super,結(jié)果如下

Paste_Image.png

沒有調(diào)用navigationController和third的childViewControllerForStatusBarStyle或者preferredStatusBarStyle方法說明前面的控制器都super了,向下modal 就會(huì)調(diào)用下一級vc的 childViewControllerForStatusBarStyle和preferredStatusBarStyle方法,如果前面一級沒有super,那么后面一級就不會(huì)調(diào)用這個(gè)兩個(gè)方法了.反過來向前dismiss時(shí)候, 本級和之前的vc都super了,下一級dismiss到本級才會(huì)調(diào)用本級的childViewControllerForStatusBarStyle和preferredStatusBarStyle方法也就是說childViewControllerForStatusBarStyle和preferredStatusBarStyle方法要想被調(diào)用,必須確保前面的vc們都super了(向下modal,不用管下一級,向上dismiss,也不用管本級是否 super)如果rootVC 不調(diào)用super 那么后面的vc都不會(huì)調(diào)用childViewControllerForStatusBarStyle和preferredStatusBarStyle方法.

Paste_Image.png

從 b dismiss 到 a 到 rootVC的結(jié)果如下,都不會(huì)調(diào)用childViewControllerForStatusBarStyle和preferredStatusBarStyle方法.

Paste_Image.png

navVC沒有 super fourth/fifth也沒有super 一直modal+push到fourth結(jié)果如下

Paste_Image.png

修改navVC super 但是fourth/fifth還沒有super 一直modal+push到fourth結(jié)果如下

Paste_Image.png

在往下modal fifth 結(jié)果如下

Paste_Image.png

從 fifth 往上 dismiss到fourth 結(jié)果如下

Paste_Image.png

從 fifth dismiss 到second 結(jié)果如下

Paste_Image.png

從 fifth pop到third 結(jié)果如下'

Paste_Image.png

從 third dismiss 到 second 結(jié)果如下

Paste_Image.png

修改navVC super 但是third/fourth/fifth還沒有super 一直modal+push到fourth結(jié)果如下

Paste_Image.png

和前面third super的調(diào)用時(shí)一樣的從 fifth dismiss 到 fourth 在pop到third 再dismiss到second 結(jié)果如下

Paste_Image.png

和前面third super的調(diào)用時(shí)一樣的從 fifth dismiss 到 fourth 再dismiss到second 結(jié)果如下

Paste_Image.png

和前面third super的調(diào)用時(shí)一樣的navigationContrller的子控制器 不具備單獨(dú)的承接能力,以navigationControllr 的是否super 為準(zhǔn)因此可以在navigationController的這個(gè)方法中處理 判斷 比如指定topViewController為某個(gè)類的時(shí)候,才能采用return self.topViewController,否則return nil-->調(diào)用navigationController自己的preferredStatusBarStyle方法

Paste_Image.png

總結(jié)一下
View controller-based status bar appearance 默認(rèn)是 NO,要修改為YES,設(shè)置控制的三個(gè)方法,才可以生效.一般來說preferredStatusBarStyle方法被調(diào)用是因?yàn)閏hildViewControllerForStatusBarStyle被調(diào)用在先.childViewControllerForStatusBarStyle調(diào)用情況是前面的vc們setNeedsStatusBarAppearanceUpdate要super.setNeedsStatusBarAppearanceUpdate方法被調(diào)用是rootVC剛顯示和vc被壓棧(壓棧的時(shí)候具有追溯性-->rootVC)當(dāng)vc要被銷毀 三個(gè)方法都不走

設(shè)置statusBar的【背景部分】1.navigationBar的setBarTintColor接口岂昭,用此接口可改變statusBar的背景色 blackColor就是純黑色

Paste_Image.png

2.可以通過以下設(shè)置:self.navigationController.navigationBar.barStyle = UIBarStyleBlack將導(dǎo)航條背景樣式設(shè)為黑色 不是純黑

Paste_Image.png
Paste_Image.png
Paste_Image.png

會(huì)導(dǎo)致setNeedsStatusBarAppearanceUpdate調(diào)用兩次

Paste_Image.png

正常是只調(diào)用1次的 在modal出navigationController的時(shí)候

Paste_Image.png

在navigationController子控制器中強(qiáng)調(diào)child方法不會(huì)繼續(xù)調(diào)用prefer方法的.

Paste_Image.png

在navigationController子控制器中強(qiáng)調(diào)prefer方法不會(huì)生效改變狀態(tài)欄的顏色,動(dòng)一下鍵盤還會(huì)調(diào)用兩遍navVC的childViewControllerForStatusBarStyle 和preferredStatusBarStyle 方法

Paste_Image.png

參考文章:
https://my.oschina.net/shede333/blog/304560
http://www.reibang.com/p/25e9c1a864be
http://www.reibang.com/p/ee1c9c91a477
http://www.reibang.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

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末据块,一起剝皮案震驚了整個(gè)濱河市关拒,隨后出現(xiàn)的幾起案子灾常,更是在濱河造成了極大的恐慌俺叭,老刑警劉巖舌仍,帶你破解...
    沈念sama閱讀 221,198評論 6 514
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件妒貌,死亡現(xiàn)場離奇詭異,居然都是意外死亡铸豁,警方通過查閱死者的電腦和手機(jī)灌曙,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,334評論 3 398
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來节芥,“玉大人在刺,你說我怎么就攤上這事⊥纺鳎” “怎么了蚣驼?”我有些...
    開封第一講書人閱讀 167,643評論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長相艇。 經(jīng)常有香客問我颖杏,道長,這世上最難降的妖魔是什么厂捞? 我笑而不...
    開封第一講書人閱讀 59,495評論 1 296
  • 正文 為了忘掉前任输玷,我火速辦了婚禮,結(jié)果婚禮上靡馁,老公的妹妹穿的比我還像新娘欲鹏。我一直安慰自己,他們只是感情好臭墨,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,502評論 6 397
  • 文/花漫 我一把揭開白布赔嚎。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪尤误。 梳的紋絲不亂的頭發(fā)上侠畔,一...
    開封第一講書人閱讀 52,156評論 1 308
  • 那天,我揣著相機(jī)與錄音损晤,去河邊找鬼软棺。 笑死,一個(gè)胖子當(dāng)著我的面吹牛尤勋,可吹牛的內(nèi)容都是我干的喘落。 我是一名探鬼主播,決...
    沈念sama閱讀 40,743評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼最冰,長吁一口氣:“原來是場噩夢啊……” “哼瘦棋!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起暖哨,我...
    開封第一講書人閱讀 39,659評論 0 276
  • 序言:老撾萬榮一對情侶失蹤赌朋,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后篇裁,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體沛慢,經(jīng)...
    沈念sama閱讀 46,200評論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,282評論 3 340
  • 正文 我和宋清朗相戀三年茴恰,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了颠焦。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,424評論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡往枣,死狀恐怖伐庭,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情分冈,我是刑警寧澤圾另,帶...
    沈念sama閱讀 36,107評論 5 349
  • 正文 年R本政府宣布,位于F島的核電站雕沉,受9級特大地震影響集乔,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜坡椒,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,789評論 3 333
  • 文/蒙蒙 一扰路、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧倔叼,春花似錦汗唱、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,264評論 0 23
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽授霸。三九已至,卻和暖如春际插,著一層夾襖步出監(jiān)牢的瞬間碘耳,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,390評論 1 271
  • 我被黑心中介騙來泰國打工框弛, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留辛辨,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,798評論 3 376
  • 正文 我出身青樓功咒,卻偏偏與公主長得像愉阎,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子力奋,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,435評論 2 359

推薦閱讀更多精彩內(nèi)容