如何使用modalPresentationCapturesStatusBarAppearance = NO与自定义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属性吗?

谢谢! 🙂

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

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

 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和更高版本,并且只有在将Info.plist的密钥UIViewControllerBasedStatusBarAppearance设置为YES时才可用。

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