美文网首页开发技巧调研
iOS 如何控制状态栏样式

iOS 如何控制状态栏样式

作者: superYang0033 | 来源:发表于2018-06-12 20:33 被阅读11次

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

1. 全局管理:通过修改全局状态栏 API 修改样式
UIApplication sharedApplication].statusBarStyle = UIStatusBarStyleLightContent;
  • 优点:API访问简单快捷,不会因为细节原因(下面会提到)改了无法生效。
  • 缺点:系统已废弃该方法。会造成全局影响,需要维护大量状态,状态管理混乱,需要考虑对其他页面造成的影响。例如:
- (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;
}
  • 优点: 系统推荐替代 -[UIApplication statusBarStyle]的方法。 让控制器自己管理当前要展示的状态栏样式,当控制器离开时自动恢复进入前状态栏样式,不会对其他页面造成影响

  • 缺点: 需要一些额外的配置和注意事项。如下:

    1. 修改 info.plist 文件配置 UIViewControllerBasedStatusBarAppearance 为 true
<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 维护状态栏样式。祝大家玩得开心。

相关文章

  • UIStatusBar

    UIStatusBar 有的时候我们需要去控制状态栏的显示和隐藏,或者控制状态栏的样式; 从iOS7开始,状态栏的...

  • iOS 状态栏的隐藏显示与状态栏样式的设置

    iOS 状态栏的隐藏显示与状态栏样式的设置 iOS 状态栏的隐藏显示与状态栏样式的设置

  • ios开发中的小技巧

    样式技巧 设置状态栏样式(ios7之前是Application类中设置的,ios9后是在控制器中设置) 设置UIT...

  • iOS 如何控制状态栏样式

    市面上使用系统方法控制状态栏的方式主要有两种: 1. 全局管理:通过修改全局状态栏 API 修改样式 优点:API...

  • 2018-04-09

    原文:IOS状态栏和导航栏的控制问题 IOS的项目多数会遇到控制状态栏和导航栏的问题,比如隐藏状态栏、控制状态栏的...

  • Swift UIStatusBarStyle 设置

    一. 设置全局控制器状态栏样式 1.取消控制器管理状态栏样式,在Supporting Files下的Info.pl...

  • iOS 9以后状态栏的设置和隐藏

    ios9后设置状态栏的样式(隐藏)时,所在的控制器中通过下面两个方法处理 - (UIStatusBarStyle)...

  • 关于iOS 9.0中状态栏的设置方法

    关于iOS 9.0中状态栏设置方法被取代 以前我们为了能够实时的控制顶部statusbar的样式,可能会在喜欢使用...

  • iOS-隐藏状态栏

    IOS9: 在需要隐藏状态栏的ViewController里面添加下面的方法 改变状态栏的样式 IOS9以前:隐藏...

  • 导航栏和状态栏

    IOS状态栏和导航栏的控制问题

网友评论

    本文标题:iOS 如何控制状态栏样式

    本文链接:https://www.haomeiwen.com/subject/apvreftx.html