我有一个自定义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属性吗?
谢谢! :)
答案 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并且在今天工作正常。