狀態(tài)欄的隱藏
狀態(tài)欄的隱藏主要有兩種方法:
方法一:通過代碼控制
@interface UIApplication(UIApplicationDeprecated)
// Setting statusBarHidden does nothing if your application is using the default UIViewController-based status bar system.
@property(readwrite, nonatomic,getter=isStatusBarHidden) BOOL statusBarHidden
NS_DEPRECATED_IOS(2_0, 9_0, "Use -[UIViewController prefersStatusBarHidden]") __TVOS_PROHIBITED;
- (void)setStatusBarHidden:(BOOL)hidden animated:(BOOL)animated
NS_DEPRECATED_IOS(2_0, 3_2) __TVOS_PROHIBITED;
// use -setStatusBarHidden:withAnimation:
- (void)setStatusBarHidden:(BOOL)hidden withAnimation:(UIStatusBarAnimation)animation
NS_DEPRECATED_IOS(3_2, 9_0, "Use -[UIViewController prefersStatusBarHidden]") __TVOS_PROHIBITED;
注意:讓我們先來看看
// Setting statusBarHidden does nothing if your application is using the default UIViewController-based status bar system.
這個(gè)注釋提示互站,蘋果提示開發(fā)者如果使用的是系統(tǒng)基礎(chǔ)的狀態(tài)欄樣式你的這些設(shè)置是不生效的膨报,在接下來要介紹的通過Info.plist
隱藏狀態(tài)欄同樣要注意這件事巴比。
在Info.plist
中添加一個(gè)View controller-based status bar appearance
設(shè)置選項(xiàng),設(shè)置為NO
這樣就可以使用上邊的方法了
很不幸iOS9之后蘋果已經(jīng)不推薦使用這些方法了,這些方法能用但是會(huì)報(bào)警告抱怔。
那么這些方法被禁用以后劣坊,如何操作呢?注釋里已經(jīng)提示Use -[UIViewController prefersStatusBarHidden]
這是iOS7之后蘋果在UIViewController
里添加的新方法屈留,這么做的目的可以讓開發(fā)者更加靈活的自定義每個(gè)ViewController
的狀態(tài)欄局冰。
- (BOOL)prefersStatusBarHidden{
return YES;
}
iOS7之后
UIViewController
中不只提供了這個(gè)關(guān)于狀態(tài)欄的設(shè)置的函數(shù),還有其他的灌危,后面詳細(xì)說康二。
方法二:通過Info.plist
控制
1,首先我們依然要設(shè)置這個(gè)(第2步中的兩種方式都要設(shè)置這個(gè)參數(shù))
2勇蝙,然后設(shè)置(兩種方式)
或者
兩者是等效的沫勿!并且兩者的狀態(tài)是同步的。
狀態(tài)欄樣式
先看看都有哪些樣式(解釋看注釋)
typedef NS_ENUM(NSInteger, UIStatusBarStyle) {
//默認(rèn)樣式味混,黑字透明狀態(tài)欄产雹,適合用于背景色為亮色的頁面
UIStatusBarStyleDefault = 0, // Dark content, for use on light backgrounds
//白字透明狀態(tài)欄,適合用于背景色為暗色的頁面
UIStatusBarStyleLightContent NS_ENUM_AVAILABLE_IOS(7_0) = 1, // Light content, for use on dark backgrounds
// iOS7.0以前黑底白字翁锡,iOS7以后跟UIStatusBarStyleLightContent效果一樣
UIStatusBarStyleBlackTranslucent NS_ENUM_DEPRECATED_IOS(2_0, 7_0, "Use UIStatusBarStyleLightContent") = 1,
// iOS7.0以前啟動(dòng)頁為灰底白字蔓挖,iOS7以后跟UIStatusBarStyleLightContent效果一樣
UIStatusBarStyleBlackOpaque NS_ENUM_DEPRECATED_IOS(2_0, 7_0, "Use UIStatusBarStyleLightContent") = 2,
} __TVOS_PROHIBITED;
如何設(shè)置狀態(tài)欄樣式
// Setting the statusBarStyle does nothing if your application is using the default UIViewController-based status bar system.
@property(readwrite, nonatomic) UIStatusBarStyle statusBarStyle
NS_DEPRECATED_IOS(2_0, 9_0, "Use -[UIViewController preferredStatusBarStyle]") __TVOS_PROHIBITED;
- (void)setStatusBarStyle:(UIStatusBarStyle)statusBarStyle animated:(BOOL)animated
NS_DEPRECATED_IOS(2_0, 9_0, "Use -[UIViewController preferredStatusBarStyle]") __TVOS_PROHIBITED;
同樣iOS9以后這些方法被禁用了,蘋果推薦在具體的viewController
中Use -[UIViewController preferredStatusBarStyle]
- (UIStatusBarStyle)preferredStatusBarStyle{
return UIStatusBarStyleLightContent;
}
注意:我們通常使用的viewController
都是嵌套在UINavigationController
中使用的盗誊,此時(shí)在viewController
中使用
- (UIStatusBarStyle)preferredStatusBarStyle;
函數(shù)會(huì)發(fā)現(xiàn)設(shè)置并沒有生效时甚。
這里鏈一篇關(guān)于這個(gè)問題的博客:UINavigationController和View Controller-based狀態(tài)欄風(fēng)格
除了以上博客中的方法外隘弊,系統(tǒng)也給我們提供了一個(gè)函數(shù)- (UIViewController *)childViewControllerForStatusBarStyle
,也可以解決這個(gè)問題荒适,后面會(huì)講梨熙。
背景色
iOS7以后默認(rèn)情況下狀態(tài)欄的背景為透明的,一種辦法是我們自己寫一個(gè)UIView作為背景添加到狀態(tài)欄下面刀诬,這樣就可以隨意設(shè)置狀態(tài)欄的顏色了咽扇。
另一種方法就是通過設(shè)置navigationBar
的setBarTintColor
顏色來改變狀態(tài)欄顏色
UIViewController中其他有關(guān)狀態(tài)欄的函數(shù)
- preferredStatusBarUpdateAnimation函數(shù)
- (UIStatusBarAnimation)preferredStatusBarUpdateAnimation
NS_AVAILABLE_IOS(7_0) __TVOS_PROHIBITED; // Defaults to UIStatusBarAnimationFade
該函數(shù)是用來設(shè)置狀態(tài)欄顯示、消失時(shí)的動(dòng)畫類型陕壹,動(dòng)畫類型有:
typedef NS_ENUM(NSInteger, UIStatusBarAnimation) {
UIStatusBarAnimationNone,
UIStatusBarAnimationFade NS_ENUM_AVAILABLE_IOS(3_2),
UIStatusBarAnimationSlide NS_ENUM_AVAILABLE_IOS(3_2),
} __TVOS_PROHIBITED;
默認(rèn)為UIStatusBarAnimationFade
质欲,當(dāng)狀態(tài)欄隱藏、顯示狀態(tài)發(fā)生改變的時(shí)候糠馆,該函數(shù)的返回值就會(huì)發(fā)揮作用嘶伟。
- childViewControllerForStatusBarStyle函數(shù)
// Override to return a child view controller or nil. If non-nil, that view controller's status bar appearance attributes will be used. If nil, self is used. Whenever the return values from these methods change, -setNeedsUpdatedStatusBarAttributes should be called.
- (nullable UIViewController *)childViewControllerForStatusBarStyle
NS_AVAILABLE_IOS(7_0) __TVOS_PROHIBITED;
這個(gè)函數(shù)的返回值默認(rèn)返回nil
,此時(shí)系統(tǒng)就會(huì)調(diào)用當(dāng)前viewControllerA
的preferredStatusBarStyle
函數(shù)又碌;如果返回值是另一個(gè)viewControllerB
那么系統(tǒng)就會(huì)調(diào)用viewControllerB
的preferredStatusBarStyle
函數(shù)九昧。
運(yùn)用這個(gè)函數(shù)就可以解決嵌套UINavigationController
設(shè)置樣式無效的問題。
解釋一下為什么嵌套
UINavigationController
的viewController
的preferredStatusBarStyle
函數(shù)設(shè)置無效:
在我們嵌套了UINavigationController
的時(shí)候毕匀,我們的
AppDelegate.window.rootViewController
通常是我們創(chuàng)建的navigationController
铸鹰,這時(shí)首先會(huì)調(diào)用的是navigationController
中的childViewControllerForStatusBarStyle
函數(shù),因?yàn)槟J(rèn)返回nil
皂岔,那么接下來就會(huì)調(diào)用navigationController
本身的preferredStatusBarStyle
函數(shù)蹋笼,所以我們在viewController
中通過preferredStatusBarStyle
函數(shù)設(shè)置的狀態(tài)欄樣式就不會(huì)被調(diào)用發(fā)現(xiàn),所以也就無效了躁垛。
所以我們要自己創(chuàng)建一個(gè)繼承于UINavigationcontroller
的
NavigationController
剖毯,在這個(gè)子類中重寫
childViewControllerForStatusBarStyle
函數(shù)
- (UIViewController *)childViewControllerForStatusBarStyle{
return self.topViewController;
}
這樣navigationController
中的childViewControllerForStatusBarStyle
函數(shù)會(huì)返回navigationController
中最上層的viewController
,那么viewController
中的preferredStatusBarStyle
函數(shù)的設(shè)置就會(huì)被系統(tǒng)獲知
- childViewControllerForStatusBarHidden函數(shù)
- (nullable UIViewController *)childViewControllerForStatusBarHidden
NS_AVAILABLE_IOS(7_0) __TVOS_PROHIBITED;
childViewControllerForStatusBarHidden
函數(shù)的使用原理同上缤苫,不再贅述速兔。
- preferredStatusBarUpdateAnimation函數(shù)
// 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
動(dòng)畫形式如下
typedef NS_ENUM(NSInteger, UIStatusBarAnimation) {
UIStatusBarAnimationNone,
UIStatusBarAnimationFade NS_ENUM_AVAILABLE_IOS(3_2),
UIStatusBarAnimationSlide NS_ENUM_AVAILABLE_IOS(3_2),
} __TVOS_PROHIBITED;
這個(gè)函數(shù)返回了動(dòng)畫效果。動(dòng)畫效果只有在prefersStatusBarHidden
函數(shù)返回值變化的時(shí)候才會(huì)展示活玲,同時(shí)要通過調(diào)用
[self setNeedsStatusBarAppearanceUpdate]
函數(shù)來重繪狀態(tài)欄
應(yīng)用
我們可以通過隱藏系統(tǒng)狀態(tài)欄涣狗,然后自定義UIWindow
通過設(shè)置setWindowLevel:UIWindowLevelStatusBar
實(shí)現(xiàn)自定義狀態(tài)欄。
版權(quán)聲明:出自MajorLMJ技術(shù)博客的原創(chuàng)作品 舒憾,轉(zhuǎn)載時(shí)必須注明出處及相應(yīng)鏈接镀钓!