iOS 之 UIStatusBar

作者: iOneWay | 来源:发表于2016-05-18 22:17 被阅读169次

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

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

    相关文章

      网友评论

        本文标题:iOS 之 UIStatusBar

        本文链接:https://www.haomeiwen.com/subject/wehhxttx.html