zoukankan      html  css  js  c++  java
  • iOS【专题】UIStatusBar篇--相关设置

    ios上状态栏 就是指的最上面的部分,状态栏分前后两部分:

    • 前景部分:就是指的显示电池、时间,网络等部分
    • 背景部分:就是显示黑色或者图片的背景部分


     一、设置statusBar的前景部分(只能显示两种颜色)

    • 黑色(UIStatusBarStyleDefault),是默认值
    • 白色(UIStatusBarStyleLightContent)

    有两个地方需要设置statusBar

    1、设置启动页的statusBar(在plist设置)

    首先,在plist里增加一行 UIStatusBarStyle(或者是“Status bar style”也可以),这里可以设置两个值,就是上面提到那两个UIStatusBarStyleDefault 和 UIStatusBarStyleLightContent,这样在app启动的launch页显示的时候,statusBar的样式就是上面plist设置的风格。

    2、设置页面的statusBar(在代码设置)

    (1)第一种方法:

    [[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleLightContent];

    或者

    //相对于上面的接口,这个接口可以动画的改变statusBar的前景色

    [[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleLightContent animated:YES];

    PS:

    (1)这种方法需要我们在plist设置"View controller-based status bar appearance"字段为NO时才起作用;

    (2)这种方法一经修改后,就是所有的页面都修改(所以对于app内有个别页面用这种方法的话,会有问题);

    (2)第二种方法:

    //在你自己的UIViewController里重写此方法,返回你需要的值(UIStatusBarStyleDefault 或者 UIStatusBarStyleLightContent);
    - (UIStatusBarStyle)preferredStatusBarStyle;

    PS:

    (1)如果VC的statusBar是一个固定值,你只需用该方法return一个固定的值;如果statusBar不是固定值,则首先需要用setNeedsStatusBarAppearanceUpdate方法(这个方法会通知系统去调用当前UIViewController的preferredStatusBarStyle方法), 这个和UIView的setNeedsDisplay原理差不多(调用UIView对象的setNeedsDisplay方法后,系统会在下次页面刷新时,调用重绘该view,系统最快能1秒刷新60次页面,具体要看程序设置)

    (2)这种方法需要我们在plist设置"View controller-based status bar appearance"字段为YES时才起作用;

    (3)如果VC在Nav里,且navigationBarHidden=NO的时候,不起作用,我们有以下解决办法:

    • 第一种方法:设置navigationBarHidden=YES,然后自定义一个
    • 第二种方法:重定义UINavigationController 的childViewControllerForStatusBarStyle 和childViewControllerForStatusBarHidden 方法来找到当前view 的preferredStatusBarStyle 和prefersStatusBarHidden方法,如下
    @interface UINavigationController (StatusBarStyle)
    @end
    @implementation UINavigationController (StatusBarStyle)
    -(UIViewController *)childViewControllerForStatusBarStyle {
        return self.topViewController;
    }
    -(UIViewController *)childViewControllerForStatusBarHidden {
        return self.topViewController;
    }
    @end

    总结一下,目前苹果推荐使用 UIViewControllerBasedStatusBarAppearance = YES; 加preferredStatusBarStyle 和prefersStatusBarHidden组合来配置status bar 的显示效果,但是在UINavigationController引导时需要重写childViewControllerForStatusBarStyle 和childViewControllerForStatusBarHidden 方法。

     二、设置statusBar的背景部分

    1、系统提供的方法

    navigationBarsetBarTintColor接口,用此接口可改变statusBar的背景色

    注意:一旦你设置了navigationBar- (void)setBackgroundImage:(UIImage *)backgroundImage forBarMetrics:(UIBarMetrics)barMetrics接口,那么上面的setBarTintColor接口就不能改变statusBar的背景色,statusBar的背景色就会变成纯黑色。

    2、创建一个UIView,充当statusBar

    设置该UIView的frame.size 和statusBar大小一样,
    设置该UIView的frame.origin 为{0,-20},
    设置该UIView的背景色为你希望的statusBar的颜色,
    在navigationBar上addSubView该UIView即可。

  • 相关阅读:
    容器跨主机网络通信学习笔记(以Flannel为例)
    Kubernetes控制器Job和CronJob
    记一次使用Flannel插件排错历程
    Kubernetes控制器Deployment
    Kubernetes如何通过StatefulSet支持有状态应用?
    react18 来了,我 get 到...
    gojs 实用高级用法
    vuecli3 vue2 保留 webpack 支持 vite 成功实践
    calibre 报错 This application failed to start because no Qt platform plugin could be initialized. Reinstalling the application may fix this problem. 解决
    unable to recognize "*.yaml": no matches for kind "RoleBinding" in version "rbac.authorization.k8s.io/v1beta1"
  • 原文地址:https://www.cnblogs.com/wangchan/p/8883611.html
Copyright © 2011-2022 走看看