4

我有一个自定义 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 属性吗?

谢谢!:)

4

1 回答 1

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
}

This requires iOS8 and newer and is only usable if you are setting the key UIViewControllerBasedStatusBarAppearance in your Info.plist to YES.

Bonus: If this does not help in the caller, use it in the shown Ccontroller. I checked my projects, in one of them it's also in the NavigationController shown as PopOver and working fine as of today.

于 2016-03-04T00:21:14.900 回答