[iOS] UIStatusBarStyle修改狀態(tài)欄樣式

很多時候我們需要修改頁面的Statusbar的樣式,這里的樣式是固定的,系統(tǒng)僅提供了兩種:

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,
} __TVOS_PROHIBITED;

這里是對UIStatusBarStyle的枚舉,雖然有四個,但是后兩個是在iOS7.0之后廢棄的,使用的時候會有警告,所以,實(shí)際上只有兩種

UIStatusBarStyleLightContent
UIStatusBarStyleDefault

下面,我們就來看一看,怎么在項(xiàng)目中根據(jù)我們的需要進(jìn)行選擇;
與狀態(tài)欄相關(guān)的方法主要有以下幾個:

- (UIStatusBarStyle)preferredStatusBarStyle NS_AVAILABLE_IOS(7_0) __TVOS_PROHIBITED; // Defaults to UIStatusBarStyleDefault
- (BOOL)prefersStatusBarHidden NS_AVAILABLE_IOS(7_0) __TVOS_PROHIBITED; // Defaults to NO
// Override to return the type of animation that should be used for status bar changes for this view controller. This currently only affects changes to prefersStatusBarHidden.
- (UIStatusBarAnimation)preferredStatusBarUpdateAnimation NS_AVAILABLE_IOS(7_0) __TVOS_PROHIBITED; // Defaults to UIStatusBarAnimationFade

第一個是狀態(tài)欄的樣式,第二個是否隱藏狀態(tài)欄,第三個是動畫方式;

1. 不含有導(dǎo)航

如果工程中沒有使用導(dǎo)航,我們直接在ViewController中重寫上面的方法就可以修改狀態(tài)欄的樣式了:

- (UIStatusBarStyle)preferredStatusBarStyle {
    
    return UIStatusBarStyleLightContent;
}

這樣可以根據(jù)我們的需求在不同的頁面進(jìn)行修改,隱藏,顯示狀態(tài)欄;
但是,當(dāng)我們使用了導(dǎo)航后,好像沒效果了?

2. 含有導(dǎo)航

如果使用了導(dǎo)航,我們再去重寫上面的方法,就失去作用了,查了寫資料,發(fā)現(xiàn):

UINavigationController不會將 preferredStatusBarStyle方法調(diào)用轉(zhuǎn)給它的子視圖,而是由它自己管理狀態(tài),而且它也應(yīng)該那樣做.因?yàn)閁INavigationController 包含了它自己的狀態(tài)欄;
因此就算 UINavigationController中的viewController 實(shí)現(xiàn)了 preferredStatusBarStyle方法 也不會調(diào)用

那么,我們怎么在使用導(dǎo)航的時候修改status bar的狀態(tài)呢?

它是基于它的 UINavigationBar.barStyle屬性.默認(rèn)(UIBarStyleDefault)的是黑色文本的狀態(tài)欄 而 UIBarStyleBlack是設(shè)置為白色文本的狀態(tài)欄;

也就是說,如果viewController是在導(dǎo)航中的,想要改變狀態(tài)欄文本顏色,那么需要通過代碼:

self.navigationController.navigationBar.barStyle = UIBarStyleBlack;//設(shè)置為白色
self.navigationController.navigationBar.barStyle = UIBarStyleDefault;//設(shè)置為黑色

很多時候,我們雖然使用了導(dǎo)航,但是導(dǎo)航條都是我們自定義的,這個時候,我們隱藏了系統(tǒng)的導(dǎo)航:

self.navigationController.navigationBarHidden = YES;//隱藏系統(tǒng)導(dǎo)航

這時,我們就可以在ViewController里重寫preferredStatusBarStyle方法,來設(shè)置狀態(tài)欄的樣式了,方式同1;

PS:如果我們設(shè)置了不同頁面的狀態(tài)欄樣式,但是在進(jìn)入到相應(yīng)頁面時,狀態(tài)欄并沒有按我們的預(yù)期發(fā)生變化,可嘗試調(diào)用下面的方式試試:

- (void)setNeedsStatusBarAppearanceUpdate

3. 設(shè)置全局的狀態(tài)欄

如果我們想更改所有的狀態(tài)欄為同樣狀態(tài),可以在設(shè)置中進(jìn)行修改:
在info.plist中添加如下字段:

<key>View controller-based status bar appearance<key>
<value>NO<value>

類型為Boolean,設(shè)置為NO;

設(shè)置為NO后,就不能使用代碼控制狀態(tài)欄的樣式了;如果想用代碼控制,就在這里設(shè)置為YES,當(dāng)然,這樣在下面的設(shè)置就無效了


然后在項(xiàng)目的額General-->Deployment Info-->Status Bar Style中選擇需要的樣式:


這樣,項(xiàng)目中所有的狀態(tài)欄就都變?yōu)榘咨牧?

4. 總結(jié)

上面的第三種方法雖然使用簡單,但是不夠靈活,不能使用代碼在程序中動態(tài)調(diào)整狀態(tài)欄的設(shè)置,如果,APP中狀態(tài)欄統(tǒng)一,可以使用此方法,簡單,高效;如果狀態(tài)欄的設(shè)置需要動態(tài)調(diào)整,就只能在方法1,2中選擇了!!!

(完)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 發(fā)現(xiàn) 關(guān)注 消息 iOS 第三方庫、插件、知名博客總結(jié) 作者大灰狼的小綿羊哥哥關(guān)注 2017.06.26 09:4...
    肇東周閱讀 15,704評論 4 61
  • 狀態(tài)欄的隱藏 狀態(tài)欄的隱藏主要有兩種方法:方法一:通過代碼控制 注意:讓我們先來看看// Setting stat...
    JerryLMJ閱讀 38,340評論 16 79
  • WebSocket-Swift Starscream的使用 WebSocket 是 HTML5 一種新的協(xié)議。它實(shí)...
    香橙柚子閱讀 24,832評論 8 183
  • 一杯敬明天,一杯敬過往。思緒萬千,何以消愁。 你有沒有一口氣堵在心里,任你如何深呼吸它都時刻提醒著你,它的存在?;?..
    麋夢閱讀 396評論 0 0
  • 有時和身邊的人聊天,大部分聽到的都是感覺每天過得很沒意思,對什么都不感興趣,上班沒意思,因?yàn)槊刻於际亲瞿切┦虑?,?..
    青梔暮笙閱讀 279評論 0 2

友情鏈接更多精彩內(nèi)容