1、UIStatusBar簡(jiǎn)介
iOS上的statusBar
就是指的最上面的20point高的部分,分為兩個(gè)部分
- 前景部分:就是指顯示信號(hào)教藻、時(shí)間距帅、電量等的狀態(tài)部分
- 后景部分:就是顯示黑色或者圖片的背景部分
2、UIStatusBar前景
2.1 UIStatusBarStyle
UIStatusBar
的前景部分實(shí)際就是通過UIStatusBarStyle
來修改括堤,iOS7之后就兩種style,
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,
}
UIStatusBarStyleDefault
默認(rèn)黑色字體
UIStatusBarStyleLightContent
白色字體
2.2 修改啟動(dòng)頁(yè)的UIStatusBarStyle
- 【General】 -->【Deployment Info】-->【Status Bar Style】
此處可設(shè)置啟動(dòng)頁(yè)的statusBarStyle
以及hidden
屬性碌秸,Requires full screen
在支持分屏多任務(wù)時(shí)需要勾選绍移。 -
Info.plist處修改
兩處修改是同步的,修改其中一處讥电,另一處會(huì)隨之變化登夫。
此處的修改只針對(duì)啟動(dòng)頁(yè)有效,對(duì)viewController
不起作用允趟。
2.3 viewController的UIStatusBarStyle
修改viewControlle
r的statusBar
有兩種方式
- 方式一:通過viewController的
-(UIStatusBarStyle)preferredStatusBarStyle
方法 - 方式二:通過
UIApplication的
方式
重點(diǎn)強(qiáng)調(diào):
Info.plist里有個(gè)View controller-based stats bar appearance
屬性恼策,沒有可以自己添加,默認(rèn)是YES
,表示通過方式一設(shè)置的UIStatusBarStyle優(yōu)先級(jí)高于方式二潮剪,當(dāng)設(shè)為NO
時(shí)反之涣楷。
2.3.1方式一詳解
此時(shí)View controller-based stats bar appearance
值要為YES
,此值默認(rèn)是YES
,Info.plist
沒添加該屬性時(shí),即為YES
主要有五個(gè)方法抗碰,在ViewController
里重寫即可狮斗。
//返回statusBarStyle
- (UIStatusBarStyle)preferredStatusBarStyle
//返回是否Hidden
- (BOOL)prefersStatusBarHidden
//更新statusBarStyle
- (void)setNeedsStatusBarAppearanceUpdate
//
- (nullable UIViewController *)childViewControllerForStatusBarStyle;
- (nullable UIViewController *)childViewControllerForStatusBarHidden;
這里說明一下setNeedsStatusBarAppearanceUpdate
和childViewControllerForStatusBarStyle
兩個(gè)方法。
-
- (void)setNeedsStatusBarAppearanceUpdate
如果在viewController
已經(jīng)顯示在當(dāng)前頁(yè)面弧蝇,你可能還要在當(dāng)前頁(yè)面不時(shí)的更改statusBar
的前景色碳褒,那么,你首先需要調(diào)用下面的setNeedsStatusBarAppearanceUpdate
方法(這個(gè)方法會(huì)通知系統(tǒng)去調(diào)用當(dāng)前UIViewController
的preferredStatusBarStyle
方法)看疗,從而改變statusBar
的statusBarStyle
沙峻。
具體用法:
-(void)changeStatsBar {
_isChange = !_isChange;
[self setNeedsStatusBarAppearanceUpdate];
}
-(UIStatusBarStyle)preferredStatusBarStyle {
return _isChange?UIStatusBarStyleLightContent:UIStatusBarStyleDefault;
}
-
- (nullable UIViewController *)childViewControllerForStatusBarStyle;
這個(gè)接口也很重要,默認(rèn)返回值為nil
两芳。當(dāng)我們調(diào)用setNeedsStatusBarAppearanceUpdate
時(shí)摔寨,系統(tǒng)會(huì)調(diào)用application.window
的rootViewController
的preferredStatusBarStyle
方法,我們的程序里一般都是用navigationController
做root
怖辆,如果是這種情況是复,那我們自己的viewController
里的preferredStatusBarStyle
根本不會(huì)被調(diào)用。這種情況下我們需要在navigationController
里重寫該方法竖螃,返回當(dāng)前正在顯示的viewController
.
如:
-(nullable UIViewController *)childViewControllerForStatusBarStyle {
return self.topViewController;
}
這里再次強(qiáng)調(diào)一下:
當(dāng)用navigationController
做root時(shí)淑廊,在viewController
里重寫上述幾個(gè)方法是無(wú)效的,如若單獨(dú)改變某個(gè)viewController
的statusBarStyle
必須在navigationController
里重寫childViewControllerForStatusBarStyle
方法實(shí)現(xiàn)
2.3.2方式二詳解
首先設(shè)置View controller-based stats bar appearance
值為NO
特咆,否則通過此方式設(shè)置的屬性都不會(huì)生效季惩。
在- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
方法里設(shè)置相關(guān)屬性方法開更改statusBar的style和hidden
@interface UIApplication(UIApplicationDeprecated)
// 顯示設(shè)置statusBarOrientation
@property(readwrite, nonatomic) UIInterfaceOrientation statusBarOrientation;
- (void)setStatusBarOrientation:(UIInterfaceOrientation)interfaceOrientation animated:(BOOL)animated;
// 設(shè)置statusBarStyle
@property(readwrite, nonatomic) UIStatusBarStyle statusBarStyle;
- (void)setStatusBarStyle:(UIStatusBarStyle)statusBarStyle animated:(BOOL)animated;
//設(shè)置statusBarHidden
@property(readwrite, nonatomic,getter=isStatusBarHidden) BOOL statusBarHidden;
- (void)setStatusBarHidden:(BOOL)hidden withAnimation:(UIStatusBarAnimation)animation;
@end
通過UIApplication
的方式,我們發(fā)現(xiàn)在iOS9以后全部都廢除了坚弱,看來蘋果官方并不推薦我們這么做蜀备。UIApplication
的方式是一種全局控制关摇,這樣的方式也確實(shí)不怎么好荒叶。
3、更改UIStatusBar后景
3.1 默認(rèn)方式
UIStatusBar
的背景默認(rèn)會(huì)顯示navigationBar
的背景或self.view
的背景输虱。所以可以通過修改navigationBar
和self.view
的背景修改statusBar
的背景些楣。
當(dāng)有navigationBar時(shí),通過下面兩個(gè)方法修改:
setBarTintColor
- (void)setBackgroundImage:(UIImage *)backgroundImage forBarMetrics:(UIBarMetrics)barMetrics
關(guān)于navigationBar
背景顏色的問題,更加詳細(xì)的內(nèi)容可以參考IOS-UINavigationController詳解沒有
navigationBar
時(shí)愁茁,通過self.view.backgroundColor
修改蚕钦。
3.2 KVO的方式修改
方法如下:
-(void)setStatusBarBackgroundColor:(UIColor *)color {
UIView *statusBar = [[[UIApplication sharedApplication] valueForKey:@"statusBarWindow"] valueForKey:@"statusBar"];
NSLog(@"statusBar.backgroundColor--->%@",statusBar.backgroundColor);
if ([statusBar respondsToSelector:@selector(setBackgroundColor:)]) {
statusBar.backgroundColor = color;
}
}
此方法修改過后,如無(wú)特別設(shè)置鹅很,其余所有的statusBar
都會(huì)該設(shè)置后的顏色嘶居。
3.3 UIView覆蓋statusBar的方式
方法如下:
-(void)setStatusBarBackgroundColor:(UIColor *)color {
UIView * statusBarView = [[UIView alloc]initWithFrame:CGRectMake(0, 0, 320, -20)];
statusBarView.backgroundColor = [UIColor orangeColor];
[self.navigationController.navigationBar addSubview:statusBarView];
}
只修改當(dāng)前navigationControlle
r的statusBar
。
參考文章:
ios上 更改 狀態(tài)欄(UIStatusBar)的顏色促煮,你值得一看邮屁、收藏
iOS7下隱藏status bar的詳細(xì)研究
ios 狀態(tài)欄statusBar的背景顏色