HBDStatusBar
官方提供了一套 API 用于控制状态栏的显示和隐藏
- (UIStatusBarAnimation)preferredStatusBarUpdateAnimation;
- (UIViewController *)childViewControllerForStatusBarHidden;
- (BOOL)prefersStatusBarHidden;
- (void)setNeedsStatusBarAppearanceUpdate;
在没有使用 UINavigationBar 的情况下,这套规则是正常运作的,生活是美好的。但一旦涉及到 UINavigationBar,事情就会变得复杂起来,那些有过经历的都应该明白,无需多言。
因此,本库诞生了,旨在解决在使用 UINavigationBar 时隐藏状态栏所引起的一系列问题。
使用方法
使用 hbd_statusBarHidden
替代 prefersStatusBarHidden
,使用 hbd_setNeedsStatusBarHiddenUpdate
替代 setNeedsStatusBarAppearanceUpdate
在需要隐藏状态栏的控制器中编写如下代码
#import <HBDStatusBar/UIViewController+StatusBar.h>
- (void)viewDidLoad
{
[super viewDidLoad];
self.hbd_statusBarHidden = YES;
}
或者
- (BOOL)hbd_statusBarHidden {
return YES;
}
这是一个声明式 API,其他不需要隐藏状态栏的页面无需任何操作。
如果需要动态隐藏或显示状态栏,在设置 hbd_statusBarHidden
后调用 hbd_setNeedsStatusBarHiddenUpdate
即可。
本库可以和 UINavigationBar 能够良好的共存
你仍然可以通过 preferredStatusBarUpdateAnimation
来指定状态栏显示或隐藏时的动画,仍然可以通过 childViewControllerForStatusBarHidden
来指定由哪个子控制器来决定是否隐藏状态栏
如果你遇到与 UINavigationBar 相关的问题,请访问 HBDNavigationBar。
更新至 iOS 13
为了适配 iOS 13,在需要隐藏状态栏的 UIViewController 中实现以下方法
- (BOOL)prefersStatusBarHidden {
if (@available(iOS 13.0, *)) {
// 返回值和 self.hbd_barHidden 设定的值一致
// 千万别返回 self.hbd_barHidden,因为 prefersStatusBarHidden 比 viewDidLoad 先执行
return YES;
} else {
// 固定返回 NO, 由 self.hbd_barHidden 决定是否隐藏状态栏
return NO;
}
}
为什么不使用方法交换(method swizzle)来搞定 prefersStatusBarHidden?
因为我无法实现,如果你有办法,请务必告诉我。感谢。
安装
HBDStatusBar 通过 CocoaPods 提供。要安装它,只需将以下行添加到你的 Podfile 中
pod 'HBDStatusBar'
作者
许可
HBDStatusBar可以在MIT许可下使用。更多信息请参阅LICENSE文件。