状态栏隐藏
-
通过Info.plist控制
(1) 在
View controller-based status bar appearance
(Info.plist) -> NO(2) 在
Status bar is initially hidden
(Info.plist) -> YES/NO. 或者 Target -> General -> Hide status bar -
通过代码控制
在
View controller-based status bar appearance
(Info.plist)YES
-> 则控制器对状态栏设置的优先级高于application
->UIViewController prefersStatusBarHidden
NO
-> 则-以application
为准, 控制器设置状态栏无效 ->[[UIApplication sharedApplication] setStatusBarHidden:YES]
状态栏设置
在 View controller-based status bar appearance
(Info.plist)
YES
-> 则控制器对状态栏设置的优先级高于application
-> UIViewController preferredStatusBarStyle
NO
-> 则-以application
为准, 控制器设置状态栏无效 -> [[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleLightContent]
1.通过UIApplication
前提 在 View controller-based status bar appearance
(Info.plist) -> NO
iOS9之后已弃用 不推荐
[[UIApplicationsharedApplication] setStatusBarHidden:YES];
[[UIApplicationsharedApplication] setStatusBarHidden:YESanimated:YES];
[[UIApplicationsharedApplication] setStatusBarStyle:UIStatusBarStyleLightContent];
[[UIApplicationsharedApplication] setStatusBarStyle:UIStatusBarStyleLightContentanimated:YES];
2.通过UIViewController
前提 在 View controller-based status bar appearance
(Info.plist) -> YES
iOS7之后添加的方法 推荐使用
- (void)setNeedsStatusBarAppearcanceUpdate;
- (UIStatusBarStyle)preferredStatusBarSytle;
- (UIViewController *)childViewControllerForStatusBarStyle;
- (BOOL)prefersStatusBarHidden;</pre>
0x01 setNeedsStatusBarApearanceUpdate()
当我们调用
setNeedsStatusBarApearanceUpdate()
时,系统会调用application.window
的rootViewController
的preferredStatusBarStyle
方法如果在
UIViewController
已经显示,这时还要在当前页面不时的更改statusBar
的前景色,那么,你首先需要调用setNeedsStatusBarApearanceUpdate()
,这个和UIView
的setNeedsDisplay
差不多
0x02 (UIStatusBarStyle)preferredStatusBarSytle
在你自己的 UIViewController
里重写此方法,返回 UIStatusBarStyleDefault
或者 UIStatusBarStyleLightContent
这里如果你只是简单
return
一个固定的值,那么该UIViewController
显示的时候,程序就会马上调用该方法,来改变statusBar的外观这里有个常见的问题重写
preferredStatusBarSytle
不调用不生效,因为这个只有在UIViewController
单独使用才会生效,但是我们大部分情况下,ViewController
都会嵌套在UINavigationController
中,解决办法也可以子类化UINavigationController,重写preferredStatusBarStyle
//HHNavigationController.h
#import <UIKit/UIKit.h>
@interfaceHHNavigationController: UINavigationController
@end
@implementationHHNavigationController
-(UIStatusBarStyle)preferredStatusBarStyle{
return self.topViewController.preferredStatusBarStyle;
}
@end
0x03 (UIViewController *)childViewControllerForStatusBarStyle
默认返回值为nil.
0x01上面说了,当我们调用
setNeedsStatusBarApearanceUpdate()
时,系统会调用application.window
的rootViewController
的preferredStatusBarStyle
方法,如果这个rootViewController
是UINavigationController
,那我们自己的UIViewController
里的preferredStatusBarStyle
根本不会调用,这也是0x02提到的原因解决0x02
(UIStatusBarStyle)preferredStatusBarSytle
不调用,也可以子类化UINavigationController,重写childViewControllerForStatusBarStyle
//HHNavigationController.h
#import <UIKit/UIKit.h>
@interfaceHHNavigationController: UINavigationController
@end
@implementationHHNavigationController
-(UIViewController*)childViewControllerForStatusBarStyle{
return self.topViewController;
}
@end
0x04 (BOOL)prefersStatusBarHidden
返回YES/NO来这是状态栏的隐藏/显示,用法与preferredStatusBarSytle
一致
总结
经过代码实践 ,Demo在这里
经过测试 如果Info.plist
View controller-based status bar appearance
不设置,默认为YES
加上舍弃弃用方法,我们只需要遵循
子类化一个UINavigationController
的类,重写
-(UIViewController*)childViewControllerForStatusBarHidden{
return self.topViewController;
}
-(UIViewController*)childViewControllerForStatusBarStyle{
return self.topViewController;
}
即可达到每个页面可以控制状态栏的效果
参考
谈一谈iOS开发中info.plist中的View controller-based status bar appearance属性