如何使用modalPresentationCapturesStatusBarAppearance = NO与自定义UIPresentationController?

时间:2015-07-27 18:47:21

标签: ios uiviewcontroller uistatusbar uimodalpresentationstyle uipresentationcontroller

我有一个自定义UIPresentationController并覆盖frameOfPresentedViewInContainerView以进行自定义viewController演示。除状态栏外,一切正常。

我根本不希望状态栏改变外观 - 它应该保持不变,但它应该保持不变。现在Apple文档:https://developer.apple.com/library/ios/documentation/UIKit/Reference/UIViewController_Class/#//apple_ref/occ/instp/UIViewController/modalPresentationCapturesStatusBarAppearance表示如果modalPresentationStyle不是UIModalPresentationFullScreen或modalPresentationCapturesStatusBarAppearance为NO,我应该没问题,状态栏不应该改变。

使用此代码:

- (BOOL)prefersStatusBarHidden {
    NSLog(
        @"prefersStatusBarHidden was called %d %ld",
        self.modalPresentationCapturesStatusBarAppearance,
        (long)self.modalPresentationStyle
    );

    return YES;
}

我可以看到调用prefersStatusBarHidden,即使modalPresentationCapturesStatusBarAppearance为NO(显示为0),modalPresentationStyle为UIModalPresentationCustom(显示为4)。

显然,这就是状态栏在呈现viewController时发生变化的原因。

但为什么?

我的想法是iOS认为viewController是全屏显示的,即使它不是。

我发现UIPresentationController的属性shouldPresentInFullscreen - 它默认返回YES。返回NO根本没有帮助,所以我不明白该财产甚至做了什么......它实际上没有任何影响。这同样适用于presentationStyle属性 - 我在改变它时没有看到任何效果。我原本期望将presentationStyle属性“重定向”到viewControllers modalPresentationStyle属性,但是它仍然保留在UIModalPresentationCustom,它必须首先启动自定义演示。

所以,我的问题是:是否有人知道如何使用自定义UIPresentationController保持状态栏 - 并且有人可以解释shouldPresentInFullscreen和presentationStyle属性吗?

谢谢! :)

1 个答案:

答案 0 :(得分:0)

尝试实现childViewControllerForStatusBarStyle:并在调用UIPresentationController的类中为它返回nil,通常是UINavigationController。

当我不想让孩子VC干扰我明智选择的状态栏样式时,这就是我在Swift中所做的事情:

override func childViewControllerForStatusBarStyle() -> UIViewController? {
    return nil // ignore childs and let this Navigation Controller handle the StatusBar style
}

override func preferredStatusBarStyle() -> UIStatusBarStyle {
    return .LightContent // or .Default depending on your Style
}

这需要iOS8及更高版本,仅在您将UIViewControllerBasedStatusBarAppearance中的密钥Info.plist设置为YES时才可用。

Bonus:如果这对调用者没有帮助,请在显示的Ccontroller中使用它。我查看了我的项目,其中一个项目也在导航控制器中显示为PopOver并且在今天工作正常。