HBDStatusBar 1.2.0

HBDStatusBar 1.2.0

listenzz 维护。



  • 作者
  • Listen

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'

作者

[email protected]

许可

HBDStatusBar可以在MIT许可下使用。更多信息请参阅LICENSE文件。