设置 StatusBar 颜色
来源:互联网 发布:java jxl jar 包 编辑:程序博客网 时间:2024/06/01 23:22
如上图这种情况下,我们可能希望将导航栏的风格修改为亮色。这里有两个方法可以实现。在iOS 7中,我们可以在每个view controller中overridingpreferredStatusBarStyle:
方法,如下所示:
- (UIStatusBarStyle)preferredStatusBarStyle{ return UIStatusBarStyleLightContent;}
不仅如此,ios还很贴心的在UIViewController也增加了几个接口,
目的是让状态栏根据当前显示的UIViewController来定制statusBar的前景部分。
- (UIStatusBarStyle)preferredStatusBarStyle;
- (UIViewController *)childViewControllerForStatusBarStyle;
- (void)setNeedsStatusBarAppearanceUpdate
- (UIStatusBarStyle)preferredStatusBarStyle:
在你自己的UIViewController里重写此方法,返回你需要的值(UIStatusBarStyleDefault 或者 UIStatusBarStyleLightContent);
注意:
- 这里如果你只是简单的return一个固定的值,那么该UIViewController显示的时候,程序就会马上调用该方法,来改变statusBar的前景部分;
- 如果在该UIViewController已经在显示在当前,你可能还要在当前页面不时的更改statusBar的前景色,那么,你首先需要调用下面的setNeedsStatusBarAppearanceUpdate方法(这个方法会通知系统去调用当前UIViewController的preferredStatusBarStyle方法), 这个和UIView的setNeedsDisplay原理差不多(调用UIView对象的setNeedsDisplay方法后,系统会在下次页面刷新时,调用重绘该view,系统最快能1秒刷新60次页面,具体要看程序设置)。
- (UIViewController *)childViewControllerForStatusBarStyle:
这个接口也很重要,默认返回值为nil。当我们调用setNeedsStatusBarAppearanceUpdate时,系统会调用application.window的rootViewController的preferredStatusBarStyle方法,我们的程序里一般都是用UINavigationController做root,如果是这种情况,那我们自己的UIViewController里的preferredStatusBarStyle根本不会被调用;
这种情况下childViewControllerForStatusBarStyle就派上用场了,
我们要子类化一个UINavigationController,在这个子类里面重写childViewControllerForStatusBarStyle方法,如下:
- (UIViewController *)childViewControllerForStatusBarStyle{ return self.topViewController;}
上面代码的意思就是说,不要调用我自己(就是UINavigationController)的preferredStatusBarStyle方法,而是去调用navigationController.topViewController的preferredStatusBarStyle方法,这样写的话,就能保证当前显示的UIViewController的preferredStatusBarStyle方法能影响statusBar的前景部分。
另外,有时我们的当前显示的UIViewController可能有多个childViewController,重写当前UIViewController的childViewControllerForStatusBarStyle方法,让childViewController的preferredStatusBarStyle生效(当前UIViewController的preferredStatusBarStyle就不会被调用了)。
简单来说,只要UIViewController重写的的childViewControllerForStatusBarStyle方法返回值不是nil,那么,UIViewController的preferredStatusBarStyle方法就不会被系统调用,系统会调用childViewControllerForStatusBarStyle方法返回的UIViewController的preferredStatusBarStyle方法。
- (void)setNeedsStatusBarAppearanceUpdate:
让系统去调用application.window的rootViewController的preferredStatusBarStyle方法,如果rootViewController的childViewControllerForStatusBarStyle返回值不为nil,则参考上面的讲解。
设置statusBar的【背景部分】
背景部分,简单来说,就是背景色;改变方法有两种:
系统提供的方法
navigationBar的setBarTintColor接口,用此接口可改变statusBar的背景色
注意:一旦你设置了navigationBar的- (void)setBackgroundImage:(UIImage *)backgroundImage forBarMetrics:(UIBarMetrics)barMetrics接口,那么上面的setBarTintColor接口就不能改变statusBar的背景色,statusBar的背景色就会变成纯黑色。
preferredStatusBarStyle 无效原因
#import "ViewController.h"@interface ViewController ()@end@implementation ViewController- (void)viewDidLoad{ [super viewDidLoad];}-(UIStatusBarStyle)preferredStatusBarStyle{ return UIStatusBarStyleDefault;}@end
如果viewController不是在 UINavgationController中,那么以上代码可以把状态栏文本颜色设置为白色,但是如果 viewController是添加到导航上的,你会发现上面代码达不到你想要的效果,状态栏文本颜色是黑色的!
这是为什么?
经过查找资料,才知道原来是这么一回事:
*UINavigationController不会将 preferredStatusBarStyle方法调用转给它的子视图,而是由它自己管理状态,而且它也应该那样做.因为UINavigationController 包含了它自己的状态栏
因此就算 UINavigationController中的viewController 实现了 preferredStatusBarStyle方法 也不会调用
那 UINavigationController是怎么决定 该返回 UIStatusBarStyleLightContent 还是 UIStatusBarStyleDefault的呢? 它是基于它的 UINavigationBar.barStyle属性.默认(UIBarStyleDefault)的是黑色文本的状态栏 而 UIBarStyleBlack是设置为白色文本的状态栏*
也就是说,如果viewController是在导航中的,想要改变状态栏文本颜色,那么需要通过代码:
//将status bar 文本颜色设置为白色self.navigationController.navigationBar.barStyle = UIBarStyleBlack;//将status bar 文本颜色设置为黑色 ,默认就是黑色self.navigationController.navigationBar.barStyle = UIBarStyleDefault;
另外,如果viewController在导航中,还想通过 preferredStatusBarStyle 方法设置状态栏文本颜色,那就只能隐藏导航栏了:
//隐藏导航栏后 系统会调用 preferredStatusBarStyle 方法self.navigationController.navigationBarHidden = YES;
- 设置statusBar的颜色
- 设置 StatusBar 颜色
- statusBar 背景颜色设置问题
- Android 设置StatusBar的颜色
- 设置UIImagePickerController的statusBar颜色
- Android StatusBar 状态栏颜色设置
- Android StatusBar 状态栏颜色设置
- swift 设置statusBar的文字颜色
- android 设置statusbar颜色和actionbar颜色一样
- ios7 statusBar的字体颜色设置为白色
- statusBar设置
- iOS statusBar 颜色问题
- 自定义statusbar颜色
- 修改StatusBar颜色
- iOS statusbar颜色
- 修改状态栏颜色 StatusBar
- 设置statusbar的颜色,适用于SDK4.4版本及以上版本
- iOS7 自定义statusBar的颜色
- Python Tricks(十一)—— 阶乘的实现
- 集合与数组之间相互转换
- 23中设计模式总览
- 拼接
- Windows下mysql忘记root密码的解决方法
- 设置 StatusBar 颜色
- 科技节图像后期处理三等奖作品---云大的陪伴最长情
- 测试种类以及区别和联系
- STM32F1_常见外设资源汇总
- 对ECHarts柱状图的初步封装
- Poj 2711:合唱队形
- 科技节编程大赛一等奖作品——朱瑞超
- 断点调试
- 数据库之SQL 语句as的用法 SQL 结果重命名