更改ios状态栏颜色
更改状态栏颜色
将iOS状态栏默认颜色为黑色,但有时为了需求,我们需要更改状态栏的颜色,常用的方式有:
方法一:
1.在info.plist添加View controller-based status bar appearance为NO;
2.在页面执行[[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleLightContent]。
但是这种做法在ios9.0以前是完全没有问题的,进入iOS9.0后,便会出现如下警告:
<Error>: CGContextSaveGState: invalid context 0x0. If you want to see the backtrace, please set CG_CONTEXT_SHOW_BACKTRACE en
为了消除这条警告:修改方式如下:
1.在info.plist删掉这条也可以,或者将View controller-based status bar appearance设置为YES
2.在需要改变颜色的页面增加:(非全局,需要在每个需要的Viewcontroller中加入)
-(UIStatusBarStyle)preferredStatusBarStyle { return UIStatusBarStyleLightContent; }
但是问题又来了,如果我们初始化一个UINavigationController或者UITabBarController作为RootViewcontroller,那么在子viewController中设置的上诉解决方案就会失效,该怎么办呢?
为UINavigationController扩展一个category,在类别里面实现如下方法,并通过UINavigationController调用该方法,那么在viewController中就可以实现状态栏颜色的改变了。
-(UIViewController *)childViewControllerForStatusBarStyle { return self.topViewController; }
在状态栏发生改变时需要调用这个方法:
[self setNeedsStatusBarAppearanceUpdate];
设置状态栏的动画效果:
-(UIStatusBarAnimation)preferredStatusBarUpdateAnimation{ // return UIStatusBarAnimationFade; return UIStatusBarAnimationSlide; }
隐藏状态栏:
如果不设置UINavigationController等,有两种方式隐藏状态栏
方法一:
1.将info.plist添加View controller-based status bar appearance为NO;
2.将info.plist添加Status bar is initially hidden为 YES。
方法二:(非全局)
-(BOOL)prefersStatusBarHidden{ return YES; }
如果初始化一个UINavigationController或者UITabBarController作为RootViewcontroller,那么第二种方法就失效了,解决办法同更改状态栏颜色。
在某一个界面中隐藏状态栏的方法:
1.在 info.plist添加View controller-based status bar appearance为NO;
2.在需要隐藏的页面:
页面将要出现时:
-(void)viewWillAppear:(BOOL)animated { [[UIApplication sharedApplication] setStatusBarHidden:YES withAnimation:UIStatusBarAnimationFade]; }
在页面消失的地方:
-(void)viewWillDisappear:(BOOL)animated { [[UIApplication sharedApplication] setStatusBarHidden:No withAnimation:UIStatusBarAnimationFade]; }