iOS通话状态栏更新视图控制器在屏幕上以模态方式呈现

时间:2015-01-07 11:37:36

标签: ios autolayout statusbar presentmodalviewcontroller in-call

我可以提出这个问题,因为经过大量研究,谷歌搜索,Stack Overflowing等近2天......

我的问题是:我从我的主ViewController呈现ViewController,如下所示:

UINavigationController *navigation = [[UINavigationController alloc] initWithRootViewController:VController];
navigation.transitioningDelegate = self;
navigation.modalPresentationStyle = UIModalPresentationCustom;

[self presentViewController:navigation
                   animated:YES
                 completion:nil];

每当iPhone用户正在通话中,或者正在使用他或她的手机作为热点时,状态栏会被放大,将我的模态显示VC推到底部,但原点设置为(0; 0) 问题是当用户在我的应用程序状态栏中调整大小到正常大小时完成调用,但Modal VC没有向上移动。

enter image description here

由于此通知,我在代码中发现了解这一点:

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(statuBarChange:) name:UIApplicationDidChangeStatusBarFrameNotification object:nil];

最糟糕的是帧是核心,而原点仍然是(0,0)

有没有办法重新呈现模态呈现的vc?没有解雇并再次提出它?

1 个答案:

答案 0 :(得分:0)

您真的需要为此模式进行自定义转换吗?如果没有,请删除“navigation.modalPresentationStyle = UIModalPresentationCustom”这一行,你就可以了。

如果您确实需要自定义样式,这是iOS 8+中UIModalPresentationCustom样式和状态栏的已知错误。 AFAIK,你必须使用animateTransition破解它并将框架推到适当的位置。

在下面的app委托中使用willChangeStatusBarFrame还有一个非常糟糕的黑客攻击。您可以通过检测是否实际存在模态以及动画更改来改进它。

- (void)application:(UIApplication *)application willChangeStatusBarFrame:(CGRect)newStatusBarFrame
{
    if (newStatusBarFrame.size.height < 40) {
        for (UIView *view in self.window.subviews) {
            view.frame = self.window.bounds;
        }
    }
}

另一种方法是使模态覆盖状态栏,并覆盖该视图控制器的prefersStatusBarHidden。

我讨厌所有这些解决方案,但是根据你的项目设置方式,你应该给你一些可行的东西,如果你不能忽略那个临时模态对话的小空间。