美文网首页开发技巧调研
iOS 如何控制状态栏样式

iOS 如何控制状态栏样式

作者: superYang0033 | 来源:发表于2018-06-12 20:33 被阅读11次

    市面上使用系统方法控制状态栏的方式主要有两种:

    1. 全局管理:通过修改全局状态栏 API 修改样式
    UIApplication sharedApplication].statusBarStyle = UIStatusBarStyleLightContent;
    
    • 优点:API访问简单快捷,不会因为细节原因(下面会提到)改了无法生效。
    • 缺点:系统已废弃该方法。会造成全局影响,需要维护大量状态,状态管理混乱,需要考虑对其他页面造成的影响。例如:
    - (void)viewWillAppear:(BOOL)animated {
        [super viewWillAppear:animated];
         // 1. 记录 push 前的状态, 如果是 pop 回来的可能是错的 。
         // 除非拿到 navigation 堆栈,做出正确判断,复杂度较高
        self.barStatus = UIApplication sharedApplication].statusBarStyle;
        // 2. 设置你想要的状态
        UIApplication sharedApplication].statusBarStyle = UIStatusBarStyleLightContent; 
    }
    - (void)viewWillDisappear:(BOOL)animated {
        [super viewWillDisappear:animated];
       // 3. 恢复原来的状态
       UIApplication sharedApplication].statusBarStyle = self.barStatus;
    }
    
    2. 控制器管理:在控制器内部配置自己的状态栏样式
    
    -  (void)viewDidLoad {
         [super viewDidLoad];
        // 1.初始化状态并保存到属性中
         self.barStatus = UIStatusBarStyleDefault;
        // 2.模拟某些条件(当页面状态栏样式固定可忽略 2. 3. 4. 步)
         dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t) (5 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
             // 3. 动态修改页面状态
             self.barStatus = UIStatusBarStyleLightContent;
             // 4. 通知控制器回调 -[UIViewController preferredStatusBarStyle] 获取最新样式
             [self setNeedsStatusBarAppearanceUpdate];
        });
    }
    
    // 1. 在控制器中重写该方法
    - (UIStatusBarStyle)preferredStatusBarStyle {
        // 2. 如果是固定不变的可以返回固定值 reture UIStatusBarStyleDefault;
        return self.barStatus;
    }
    
    • 优点: 系统推荐替代 -[UIApplication statusBarStyle]的方法。 让控制器自己管理当前要展示的状态栏样式,当控制器离开时自动恢复进入前状态栏样式,不会对其他页面造成影响

    • 缺点: 需要一些额外的配置和注意事项。如下:

      1. 修改 info.plist 文件配置 UIViewControllerBasedStatusBarAppearance 为 true
    <key>UIViewControllerBasedStatusBarAppearance</key>
    <true/>
    
    1. 当你的控制器需要父子控制器嵌套时,需要使用指定 API 告知需要控制器状态栏的子控制器,常见于 UINavigationController/ UITabBarController 或者自定义父子控制器中。如果不实现 API 或者返回为 nil,则使用父控制器自己的状态栏样式。
    @interface YCTabBarController : UITabBarController
    @end
    
    @implementation YCTabBarController
    
    // 1. 重写父类方法,返回选中的子控制器
    - (UIViewController *)childViewControllerForStatusBarStyle {
        return self.selectedViewController;
    }
    
    ... 
    ...
    
    
    @end
    
    
    @interface YCNavigationController : UINavigationController
    @end
    
    @implementation YCNavigationController
    
    // 1. 重写父类方法,返回当前需要展示的控制器
    - (UIViewController *)childViewControllerForStatusBarStyle {
        return self.topViewController;
    }
    
    ... 
    ...
    
    @end
    
    // 自定义控制器视情况重写父类方法控制器
    
    1. 满足以上配置,亦可使用同类状态栏配置属性
    // 默认 UIStatusBarStyleDefault,  重写进行控制。
    @property(nonatomic, readonly) UIStatusBarStyle preferredStatusBarStyle;
    // 默认为 NO, 重写进行控制器。
    @property(nonatomic, readonly) BOOL prefersStatusBarHidden;
    // 重写并返回状态栏变化动画枚举值,
    // 动画只在用于prefersStatusBarHidden 发送改变时, 
    // 默认为UIStatusBarAnimationFade;
    @property(nonatomic, readonly) UIStatusBarAnimation preferredStatusBarUpdateAnimation;
    

    总结

    为了避免无用的状态维护代码,推荐使用系统新的控制器 API 维护状态栏样式。祝大家玩得开心。

    相关文章

      网友评论

        本文标题:iOS 如何控制状态栏样式

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