相关的理论知识
状态栏前景颜色种类
- 默认的黑色(UIStatusBarStyleDefault)
- 白色(UIStatusBarStyleLightContent)
状态栏前景颜色设置的地方有两个:plist设置 和 代码设置
1.plist里面设置:
1.Targets=>General=>Deployment Info
这里可以设置启动图的状态栏是否显示及其颜色
2.Targets=>Info=>View controller-based status bar appearance
YES,
则控制器对状态栏设置的优先级高于
[[UIApplication sharedApplication] setStatusBarStyle:<#UIStatusBarStyle#>];
NO,
则以 [[UIApplication sharedApplication] setStatusBarStyle:<#UIStatusBarStyle#>];
为准
2.代码设置
UIViewController有四个相关的函数
- (UIStatusBarStyle)preferredStatusBarStyle;
- (BOOL)prefersStatusBarHidden;
- (void)setNeedsStatusBarAppearanceUpdate;
- (UIViewController *)childViewControllerForStatusBarStyle;
-
-(BOOL)prefersStatusBarHidden;
在UIViewController里重写此方法,可以定制某个 控制器 对应的状态栏是否隐藏 -
-(UIStatusBarStyle)preferredStatusBarStyle;
在UIViewController里重写此方法,可以定制某个 控制器 对应的状态栏前景颜色 -
-(void)setNeedsStatusBarAppearanceUpdate;
如果UIViewController已经在显示,你还要更改statusBar的前景色,那么,你首先需要调用下面的setNeedsStatusBarAppearanceUpdate方法(这个方法会通知系统去调用当前UIViewController的preferredStatusBarStyle方法 -
-(UIViewController *)childViewControllerForStatusBarStyle;
我们的程序里一般都是用UINavigationController做root,如果是这种情况,那我们自己的UIViewController里的preferredStatusBarStyle根本不会被调用。
这种情况下childViewControllerForStatusBarStyle就派上用场了,我们要子类化一个UINavigationController,在这个子类里面重写childViewControllerForStatusBarStyle方法,如下:
- (UIViewController *)childViewControllerForStatusBarStyle{
return self.topViewController;
}
意思是,不要调用UINavigationController的preferredStatusBarStyle方法,而是去调用navigationController.topViewController的preferredStatusBarStyle方法,这样就能让当前显示的UIViewController的preferredStatusBarStyle方法能影响statusBar的样式
我的实践
-
设置启动页状态栏
Targets=>General=>Deployment Info 在这里设置状态栏是否显示及其样式
-
设置控制器优先于Application
Targets=>Info=>View controller-based status bar appearance 设置为YES
-
让当前显示的UIViewController能控制状态栏的样式
BaseNavigationController 继承自 UINavigationController, 重写childViewControllerForStatusBarStyle方法,如下:
- (UIViewController *)childViewControllerForStatusBarStyle { return self.topViewController; }
-
在BaseViewController里面设置该App的主题状态栏样式
- (UIStatusBarStyle)preferredStatusBarStyle { return <#UIStatusBarStyle#>; }
-
在需要定制化状态栏样式的SomeoneViewController里设置特定的状态栏样式
- (UIStatusBarStyle)preferredStatusBarStyle { return <#UIStatusBarStyle#>; }
网友评论