一般情况下一个app的navigationBar样式很固定,只有一种或者最多两三种样式;一方面一个app应该有一个自己的风格,另一方面自定义navigationBar样式需要不少时间,不同样式的navigationBar页面跳转时容易出现问题;
如果你们app的navigationBar样式有很多种,那么一种情况是app的功能模块比较多,不同模块的风格不同;另一种情况是你们公司的产品和UI在联合装逼,想把app做的花里胡哨,这种产品和UI水平一般不高(没错我就是在抱怨😂,说产品坏话);
iOS的statusBar样式设计到两个概念
- 前景部分(运营商、电池电量等文字或者图标颜色)
- 背景部分(背景)
新建项目默认启动页的状态栏文字为白色,启动之后变为黑色,如果这正是你需要的样式,那么恭喜你,省事儿了。
iOS7之后状态栏颜色有两种
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;
- UIStatusBarStyleDefault(默认黑色)
- UIStatusBarStyleLightContent(白色)
设置所有页面的状态栏颜色为白色/黑色(包括启动页)
如果app中只有一种风格,我们需要统一设置;
首先在info.plist中新增View controller-based status bar appearance
并设置为NO
View controller-based status bar appearance项设为YES,则View controller对status bar的设置优先级高于application的设置。为NO则以application的设置为准,view controller的prefersStatusBarHidden、preferredStatusBarStyle方法无效,是根本不会被调用的。
- 设置general->status bar style 为Light(白色)/default(黑色)(info中设置也一样)
- 或者在
didFinishLaunchingWithOptions
方法中[UIApplication sharedApplication].statusBarStyle = UIStatusBarStyleLightContent;
这种优先级更高
页面中改变statusBar的文字颜色
同样需要View controller-based status bar appearance
设置为YES(默认就是YES)
在controller中重写方法
-(UIStatusBarStyle)preferredStatusBarStyle
{
// return UIStatusBarStyleDefault;//黑色
return UIStatusBarStyleLightContent;//白色
}
什么??????????preferredStatusBarStyle方法不执行,那么可能需要在导航控制器中重写两个方法
-(UIViewController *)childViewControllerForStatusBarHidden
{
return self.topViewController;
}
-(UIViewController *)childViewControllerForStatusBarStyle
{
return self.topViewController;
}
可以使用setNeedsStatusBarAppearanceUpdate
触发preferredStatusBarStyle 和prefersStatusBarHidden
- (void)btnDidClicked:(UIButton *)btn {
self.isWhite = !self.isWhite;
[self setNeedsStatusBarAppearanceUpdate];
}