开发技巧调研

iOS 如何控制状态栏样式

2018-06-12  本文已影响11人  superYang0033

市面上使用系统方法控制状态栏的方式主要有两种:

1. 全局管理:通过修改全局状态栏 API 修改样式
UIApplication sharedApplication].statusBarStyle = UIStatusBarStyleLightContent;
- (void)viewWillAppear:(BOOL)animated {
    [super viewWillAppear:animated];
     // 1. 记录 push 前的状态, 如果是 pop 回来的可能是错的 。
     // 除非拿到 navigation 堆栈,做出正确判断,复杂度较高
    self.barStatus = UIApplication sharedApplication].statusBarStyle;
    // 2. 设置你想要的状态
    UIApplication sharedApplication].statusBarStyle = UIStatusBarStyleLightContent; 
}
- (void)viewWillDisappear:(BOOL)animated {
    [super viewWillDisappear:animated];
   // 3. 恢复原来的状态
   UIApplication sharedApplication].statusBarStyle = self.barStatus;
}
2. 控制器管理:在控制器内部配置自己的状态栏样式

-  (void)viewDidLoad {
     [super viewDidLoad];
    // 1.初始化状态并保存到属性中
     self.barStatus = UIStatusBarStyleDefault;
    // 2.模拟某些条件(当页面状态栏样式固定可忽略 2. 3. 4. 步)
     dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t) (5 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
         // 3. 动态修改页面状态
         self.barStatus = UIStatusBarStyleLightContent;
         // 4. 通知控制器回调 -[UIViewController preferredStatusBarStyle] 获取最新样式
         [self setNeedsStatusBarAppearanceUpdate];
    });
}

// 1. 在控制器中重写该方法
- (UIStatusBarStyle)preferredStatusBarStyle {
    // 2. 如果是固定不变的可以返回固定值 reture UIStatusBarStyleDefault;
    return self.barStatus;
}
<key>UIViewControllerBasedStatusBarAppearance</key>
<true/>
  1. 当你的控制器需要父子控制器嵌套时,需要使用指定 API 告知需要控制器状态栏的子控制器,常见于 UINavigationController/ UITabBarController 或者自定义父子控制器中。如果不实现 API 或者返回为 nil,则使用父控制器自己的状态栏样式。
@interface YCTabBarController : UITabBarController
@end

@implementation YCTabBarController

// 1. 重写父类方法,返回选中的子控制器
- (UIViewController *)childViewControllerForStatusBarStyle {
    return self.selectedViewController;
}

... 
...


@end


@interface YCNavigationController : UINavigationController
@end

@implementation YCNavigationController

// 1. 重写父类方法,返回当前需要展示的控制器
- (UIViewController *)childViewControllerForStatusBarStyle {
    return self.topViewController;
}

... 
...

@end

// 自定义控制器视情况重写父类方法控制器
  1. 满足以上配置,亦可使用同类状态栏配置属性
// 默认 UIStatusBarStyleDefault,  重写进行控制。
@property(nonatomic, readonly) UIStatusBarStyle preferredStatusBarStyle;
// 默认为 NO, 重写进行控制器。
@property(nonatomic, readonly) BOOL prefersStatusBarHidden;
// 重写并返回状态栏变化动画枚举值,
// 动画只在用于prefersStatusBarHidden 发送改变时, 
// 默认为UIStatusBarAnimationFade;
@property(nonatomic, readonly) UIStatusBarAnimation preferredStatusBarUpdateAnimation;

总结

为了避免无用的状态维护代码,推荐使用系统新的控制器 API 维护状态栏样式。祝大家玩得开心。

上一篇下一篇

猜你喜欢

热点阅读