iOS 技能

iOS设置statusBar颜色

2020-05-28  本文已影响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哪里出问题了

上一篇下一篇

猜你喜欢

热点阅读