iOS 之 UIStatusBar
2016-05-18 本文已影响169人
iOneWay
在iOS7之后,statusBar是透明的,也就是说状态栏只有文字色没有背景。
在iOS7之后,状态栏有两种风格:
typedef NS_ENUM(NSInteger, UIStatusBarStyle) {
UIStatusBarStyleDefault = 0, // Dark content, for use on light backgrounds
UIStatusBarStyleLightContent
}
//UIStatusBarStyleDefault: 黑色文字,浅色背景时使用
//UIStatusBarStyleLightContent : 白色文字,深色背景时使用
设置状态栏
方式一、
在需要设置状态栏的ViewController中重载以下方法:
- (UIStatusBarStyle)preferredStatusBarStyle
{
return UIStatusBarStyleLightContent; //返回状态栏风格
}
- (BOOL)prefersStatusBarHidden
{
return YES; //隐藏状态栏
}
优点:可以分页面进行状态栏变更,比较灵活。
缺点:1,若ViewController在UINativeGationController中,则以上方法讲不会调用。
2,UIViewController在加载时调用以上方法,加载完毕后将无法改变状态栏。
方式二、
第一步:代码设置:
[[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleLightContent];//设置风格
[[UIApplication sharedApplication] setStatusBarHidden:YES];设置隐藏
第二步:修改项目plist文件的一个选项值为NO,若无该选项则手动添加:
View controller-based status bar appearance >> NO //默认为YES
该选项默认为YES,为YES时,方式二
对状态栏的修改则无效。为NO时,则方式一
对状态栏的修改则无效。
优点: 1,一处设置,处处生效。
2,可以在任意时刻改变状态栏,即便是ViewController已经加载完毕。
问题:
1,当ViewController作为NavigationController的子Controller时,ViewController的preferredStatusBarStyle和prefersStatusBarHidden方法即便被重载也不会被调用, 而是转而调用NavigationController的这两个方法。这样就无法改变子页面的状态栏了。
解决方案一、
使用全局设置方法
第一步:设置plist文件选项值:
View controller-based status bar appearance >> NO //默认为YES
第二步:代码设置
//设置该子页面状态栏
- (void)viewWillAppear:(BOOL)animated {
[UIApplication sharedApplication].statusBarStyle = UIStatusBarStyleLightContent;
}
//恢复状态栏
- (void)viewWillDisappear:(BOOL)animated {
[super viewWillDisappear:animated];
[UIApplication sharedApplication].statusBarStyle = UIStatusBarStyleDefault;
}
解决方案二、
继承UINativationController
第一步:设置plist文件选项值:
View controller-based status bar appearance >> YES //默认为YES
第二步:继承UINativationController,并重载以下方法:
//方法返回值为nil,则调用当前self的状态栏设置方法;
//返回值不为nil,则调用返回值的状态栏设置方法;
- (UIViewController *)childViewControllerForStatusBarStyle {
return self.topViewController;
}
隐藏状态栏
方法一、全局设置
[UIApplication sharedApplication].statusBarHidden = YES;
//设置之前要首先设置plist文件:
//View controller-based status bar appearance >> NO
方法二、局部设置
- (BOOL)prefersStatusBarHidden
{
return YES;
}
//设置之前要首先设置plist文件:
//View controller-based status bar appearance >> YES
方法三、设置plist文件
Status bar is initially hidden >> YES
View controller-based status bar appearance >> NO
方法四、设置windowLevel
UIWindow *window = UIApplication.sharedApplication().keyWindow
window.windowLevel = UIWindowLevelStatusBar + 1
设置状态栏颜色
方法一、设置navigationBar的setBarTintColor
[self.navigationController.navigationBar setBackgroundImage:[[UIImage alloc] init] forBarPosition:UIBarPositionAny barMetrics:UIBarMetricsDefault];
没有UINavigationBar时采用方法二:
方法二、添加子View
UIView *sv = [[UIView alloc] initWithFrame:CGRectMake(0, -20, 320, 20)];
sv.backgroundColor = [UIColor greenColor];
//设置navigationBar与self.view同色。
[self.navigationController.navigationBar setBarTintColor:self.view.backgroundColor];
//addsubview 子view
[self.navigationController.navigationBar addSubview:sv];
// 隐藏NavigationBar下边线
[[UINavigationBar appearance] setBackgroundImage:[[UIImage alloc] init] forBarPosition:UIBarPositionAny barMetrics:UIBarMetricsDefault];
[[UINavigationBar appearance] setShadowImage:[[UIImage alloc] init]];
其他API
//设置动画
- (UIStatusBarAnimation)preferredStatusBarUpdateAnimation;
//动画设置状态栏
[[UIApplication sharedApplication]
setStatusBarStyle:UIStatusBarStyleLightContent animated:YES];
//刷新状态栏显示
[self setNeedsStatusBarAppearanceUpdate];
有不全之处或者存在错误,欢迎指正.