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哪里出问题了