iOS开发iOS开发移动开发

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

设置状态栏颜色

方法一、设置navigationBarsetBarTintColor

[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];

有不全之处或者存在错误,欢迎指正.

上一篇下一篇

猜你喜欢

热点阅读