詳解在iOS App中自定義和隱藏狀態(tài)欄的方法
自定義狀態(tài)欄
有時(shí)候,需要在狀態(tài)欄上顯示一些自定義信息,比如新浪微博的官方iOS客戶端:告知用戶信息處于發(fā)送隊(duì)列、發(fā)送成功或者發(fā)送失敗。

如上圖,通過在狀態(tài)欄顯示自定義信息,可以給用戶友好又不影響軟件使用的提示。
為此,我們顯得定義一個(gè)自定義狀態(tài)欄類,包含一個(gè)顯示信息的Label:
@interface CustomStatusBar : UIWindow
{
UILabel *_messageLabel;
}
- (void)showStatusMessage:(NSString *)message;
- (void)hide;
@end
接著,設(shè)置大小和系統(tǒng)狀態(tài)欄一致,背景為黑色:
self.frame = [UIApplication sharedApplication].statusBarFrame;
self.backgroundColor = [UIColor blackColor];
到這里,為了讓自定義的狀態(tài)欄可以讓用戶看到,還需要設(shè)置它的windowLevel。
在iOS中,windowLevel屬性決定了UIWindow的顯示層次。默認(rèn)的windowLevel為UIWindowLevelNormal,即0.0。
系統(tǒng)定義了三個(gè)層次如下,
const UIWindowLevel UIWindowLevelNormal;
const UIWindowLevel UIWindowLevelAlert;
const UIWindowLevel UIWindowLevelStatusBar;
typedef CGFloat UIWindowLevel;
為了能夠覆蓋系統(tǒng)默認(rèn)的狀態(tài)欄,我們把自定義的狀態(tài)欄的windowLevel調(diào)高點(diǎn):
self.windowLevel = UIWindowLevelStatusBar + 1.0f;
隱藏狀態(tài)欄
如果想要隱藏狀態(tài)欄,有兩種做法:
狀態(tài)欄是否隱藏默認(rèn)由控制器管理,也就是說,當(dāng)前狀態(tài)欄所對(duì)應(yīng)的控制器決定是否隱藏狀態(tài)欄。
UIViewController中提供了一個(gè)prefersStatusBarHidden方法用于查看當(dāng)前的控制器顯示的狀態(tài)欄是否隱藏,默認(rèn)這個(gè)方法返回的是NO,也就是不隱藏。但是并沒有提供相應(yīng)的方法來設(shè)置隱藏狀態(tài)欄。
這種情況我們可以重寫prefersStatusBarHidden方法,通過修改它的返回值達(dá)到目的。
- (BOOL)prefersStatusBarHidden
{
return YES;
}
這樣狀態(tài)欄就可以隱藏了。
另一種做法是不讓控制器來決定是否隱藏狀態(tài)欄,而是讓[UIApplication sharedApplication]來決定。
[UIApplication sharedApplication].statusBarHidden = YES;
運(yùn)行程序發(fā)現(xiàn)狀態(tài)欄并沒有隱藏。查看文檔可以發(fā)現(xiàn):
Setting statusBarHidden does nothing if your application is using the default UIViewController-based status bar system.
意思是如果使用默認(rèn)的控制器管理狀態(tài)欄(第一種做法提到的),那么設(shè)置statusBarHidden是沒有效果的。想要關(guān)閉控制器的管理,需要我們給Info.plist增加一個(gè)key:
View controller-based status bar appearance
并且設(shè)置為NO,這樣就可以通過設(shè)置statusBarHidden來隱藏狀態(tài)欄了。(這個(gè)key是Info.plist添加Key出現(xiàn)的下拉欄里的最后一個(gè))
當(dāng)控制器管理狀態(tài)欄時(shí)
- (UIViewController *)childViewControllerForStatusBarHidden
- (UIViewController *)childViewControllerForStatusBarStyle
這兩個(gè)方法可以將狀態(tài)欄的控制權(quán)交給子控制器管理,如果返回nil則表示控制器自己來管理狀態(tài)欄;如果返回子控制器,則表示子控制器來管理狀態(tài)欄。比如在navigation controller中實(shí)現(xiàn)prefersStatusBarHidden方法可能并不管用,因?yàn)樗赡苣J(rèn)在childViewControllerForStatusBarHidden中返回的是導(dǎo)航棧頂控制器,此時(shí)狀態(tài)欄由棧頂控制器來決定。如果想讓navigation controller來決定,那么可以在類中按下面的方式實(shí)現(xiàn):
- (UIViewController *)childViewControllerForStatusBarHidden
{
return nil;
}
此時(shí),狀態(tài)欄的管理權(quán)在導(dǎo)航控制器。
- iOS 自定義狀態(tài)欄和導(dǎo)航欄詳細(xì)介紹
- iOS實(shí)現(xiàn)點(diǎn)擊狀態(tài)欄自動(dòng)回到頂部效果詳解
- iOS 隱藏導(dǎo)航條和狀態(tài)欄實(shí)現(xiàn)方法
- 圖文講解如何解決App的iOS 7頂部狀態(tài)欄適配問題
- iOS 設(shè)置狀態(tài)欄的背景顏色方法
- 深入理解iOS的狀態(tài)欄
- iOS在狀態(tài)欄上顯示提醒信息的功能定制
- IOS點(diǎn)擊按鈕隱藏狀態(tài)欄詳解及實(shí)例代碼
- IOS 開發(fā)狀態(tài)欄隱藏的實(shí)現(xiàn)辦法
- iOS狀態(tài)欄、導(dǎo)航欄的一些筆記分享
相關(guān)文章
詳解IOS判斷當(dāng)前網(wǎng)絡(luò)狀態(tài)的三種方法
這篇文章主要介紹了詳解IOS判斷當(dāng)前網(wǎng)絡(luò)狀態(tài)的三種方法,網(wǎng)絡(luò)狀態(tài)是非常重要的知識(shí),感興趣的同學(xué),必須要看一下2021-04-04
詳解iOS開發(fā)中Keychain的相關(guān)使用
這篇文章主要介紹了iOS開發(fā)中Keychain的相關(guān)使用,文中列舉了一個(gè)使用Keychain來保存密碼的例子,需要的朋友可以參考下2015-10-10
快速解決ios微信下audio無法自動(dòng)播放的問題
下面小編就為大家分享一篇快速解決ios微信下audio無法自動(dòng)播放的問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2018-03-03
iOS 統(tǒng)計(jì)Xcode項(xiàng)目代碼行數(shù)的實(shí)例
下面小編就為大家分享一篇iOS 統(tǒng)計(jì)Xcode項(xiàng)目代碼行數(shù)的實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2018-01-01

