iOS 7 ~ iOS 9
UIAplication方法
- info.plist设置
首先,需要在info.plist
文件里将View controller-based status bar appearance
设置为NO
,因为它的默认值是YES
,然后就可以利用UIApplication
来设置了。
- UIAplication方法设置
// 设置StatusBar样式 @property(readwrite, nonatomic) UIStatusBarStyle statusBarStyle; - (void)setStatusBarStyle:(UIStatusBarStyle)statusBarStyle animated:(BOOL)animated; // 显示、隐藏StatusBar @property(readwrite, nonatomic,getter=isStatusBarHidden) BOOL statusBarHidden - (void)setStatusBarHidden:(BOOL)hidden withAnimation:(UIStatusBarAnimation)animation;
示例代码:
- (IBAction)colorSeg1Action:(UISegmentedControl *)sender {
if (sender.selectedSegmentIndex == 0) {
// 设置黑色StatusBar
// [[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleDefault];
[[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleDefault animated:YES];
}
else {
// 设置白色StatusBar
// [[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleLightContent];
[[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleLightContent animated:YES];
}
}
- (IBAction)showSegAction:(UISegmentedControl *)sender {
if (sender.selectedSegmentIndex == 0) {
// 显示StatusBar
// [[UIApplication sharedApplication] setStatusBarHidden:NO];
[[UIApplication sharedApplication] setStatusBarHidden:NO withAnimation:UIStatusBarAnimationSlide];
}
else {
// 隐藏StatusBar
// [[UIApplication sharedApplication] setStatusBarHidden:YES];
[[UIApplication sharedApplication] setStatusBarHidden:YES withAnimation:UIStatusBarAnimationSlide];
}
}
效果:
iOS 9 之后
UIApplication
的控制状态栏的方法,在iOS 9
之后被弃用了,所以iOS 9
之后尽量使用重写ViewController
方法的方式吧。
ViewController方法
- info.plist设置
首先,要确保info.plist
文件中View controller-based status bar appearance
为YES
,没有添加这个key
的时候,默认是YES
。 - 重写StatusBar方法
// 设置黑白状态 - (UIStatusBarStyle)preferredStatusBarStyle NS_AVAILABLE_IOS(7_0) __TVOS_PROHIBITED; // Defaults to UIStatusBarStyleDefault // 设置显示隐藏,Defaults to NO - (BOOL)prefersStatusBarHidden NS_AVAILABLE_IOS(7_0) __TVOS_PROHIBITED; // 设置切换动画 - (UIStatusBarAnimation)preferredStatusBarUpdateAnimation NS_AVAILABLE_IOS(7_0) __TVOS_PROHIBITED;
- 更新StatusBar
// UIViewController对象方法 - (void)setNeedsStatusBarAppearanceUpdate NS_AVAILABLE_IOS(7_0) __TVOS_PROHIBITED;
示例代码:
@interface ViewController ()
@property (nonatomic, assign) UIStatusBarStyle statusBarStyle; /**< 状态栏样式 */
@property (nonatomic, assign) BOOL statusBarHidden; /**< 状态栏隐藏 */
@end
- (IBAction)colorSeg2Action:(UISegmentedControl *)sender {
if (sender.selectedSegmentIndex == 0) {
self.statusBarStyle = UIStatusBarStyleDefault;
}
else {
self.statusBarStyle = UIStatusBarStyleLightContent;
}
[self setNeedsStatusBarAppearanceUpdate];
}
- (IBAction)showSeg2Action:(UISegmentedControl *)sender {
if (sender.selectedSegmentIndex == 0) {
self.statusBarHidden = NO;
}
else {
self.statusBarHidden = YES;
}
[self setNeedsStatusBarAppearanceUpdate];
}
/**
* 控制状态栏的样式
* 要刷新状态栏,让其重新执行该方法需要调用{-setNeedsStatusBarAppearanceUpdate}
*
* @return 将要显示的状态栏样式
*/
- (UIStatusBarStyle)preferredStatusBarStyle {
return self.statusBarStyle;
}
/**
* 状态栏显示还是隐藏
* 要刷新状态栏,让其重新执行该方法需要调用{-setNeedsStatusBarAppearanceUpdate}
*
* @return BOOL值
*/
- (BOOL)prefersStatusBarHidden {
return self.statusBarHidden;
}
/**
* 状态栏改变的动画,这个动画只影响状态栏的显示和隐藏
*
* @return 动画效果
*/
- (UIStatusBarAnimation)preferredStatusBarUpdateAnimation {
return UIStatusBarAnimationSlide;
}
效果:
带导航的设置
如果我们使用UINavigationController
,会发现在原来的ViewController
里修改状态栏的style
不起作用了,但是控制状态栏的显示和隐藏不受影响。但是使用UITabBarController
依然正常,状态栏不受UITabBarController
影响。
重写UINavigaitonController
的- (UIStatusBarStyle)preferredStatusBarStyle
方法。
@implementation BaseNavigationController
- (void)viewDidLoad {
[super viewDidLoad];
}
- (UIStatusBarStyle)preferredStatusBarStyle {
return [self.topViewController preferredStatusBarStyle];
}
@end
效果:
网友评论