美文网首页iOS 技能
iOS设置statusBar颜色

iOS设置statusBar颜色

作者: 没脑子的程序员 | 来源:发表于2020-05-28 16:52 被阅读0次

    1、全局初始化设置statusBar的颜色

    在 Info.plist 里增加一行 UIStatusBarStyle或者Status bar style,然后可以选择你想要设置的风格,设置可以从启动应用时就影响statusBar的颜色。

    ps:启动页的时候的颜色只能通过这个参数控制。

    2、局部页面修改statusBar的颜色

    很多情况下我们可能需要单独设置某个页面的statusBar的颜色,我们需要在Info.plist 里增加一行View controller-based status bar appearance

    设置为YES,则控制器对状态栏设置的优先级高于application,我们可以通过重写每个UIViewController里的- (UIStatusBarStyle)preferredStatusBarStyle

    设置为NO,则以application为准,我们需要通过设置[UIApplication sharedApplication].statusBarStyle来修改控制器的颜色

    YES的情况下,如果控制器是在UINavigationController堆栈中的,那么这个设置会无效,我们都知道UINavigationController是继承自UIViewController,因此也会有这个方法,使得具体的UIViewController无效。

    上面的情况的解决方法:

    方法一:

    自定义自己的导航控制器继承UINavigationController,然后重写方法

    - (UIStatusBarStyle)preferredStatusBarStyle
    {
        return self.topViewController.preferredStatusBarStyle;
    }
    

    将工程内的系统的UINavigationController全部替换成自己创建的,这样控制器里的- (UIStatusBarStyle)preferredStatusBarStyle就可以生效了,如控制器里没有实现该方法就会显示Default的风格

    方法二:

    第一种方法会比较麻烦,而且如果是老的项目修改起来会非常麻烦,我们也可以通过穿件分类Category和方法替换swizzleMethod来实现

    第一步:先创建一个UINavigationController的分类
    第二步:重写 + (void)load方法,在方法中替换- (UIStatusBarStyle)preferredStatusBarStyle方法,并实现被替换进去的- (UIStatusBarStyle)topViewControllerPreferredStatusBarStyle

    + (void)load
    {
        swizzleMethod(self, @selector(preferredStatusBarStyle), @selector(topViewControllerPreferredStatusBarStyle));
    }
    
    - (UIStatusBarStyle)topViewControllerPreferredStatusBarStyle
    {
        return self.topViewController.preferredStatusBarStyle;
    }
    

    上面方法中的宏定义如下,想要了解swizzleMethod的可以去学习runtime的相关知识

    #define swizzleMethod(class, originalSelector, swizzledSelector) {              \
    Method originalMethod = class_getInstanceMethod(class, (originalSelector)); \
    Method swizzledMethod = class_getInstanceMethod(class, (swizzledSelector)); \
    if (!class_addMethod((class),                                               \
    (originalSelector),                                    \
    method_getImplementation(swizzledMethod),              \
    method_getTypeEncoding(swizzledMethod))) {             \
    method_exchangeImplementations(originalMethod, swizzledMethod);         \
    } else {                                                                    \
    class_replaceMethod((class),                                            \
    (swizzledSelector),                                 \
    method_getImplementation(originalMethod),           \
    method_getTypeEncoding(originalMethod));            \
    }                                                                           \
    }
    

    ps:第一行变灰了不是注释掉了,不知道markdown哪里出问题了

    相关文章

      网友评论

        本文标题:iOS设置statusBar颜色

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