Ios 交互式视图控制器解雇和更改statusBarStyle不兼容?

Ios 交互式视图控制器解雇和更改statusBarStyle不兼容?,ios,cocoa-touch,uiviewcontroller,uikit,statusbar,Ios,Cocoa Touch,Uiviewcontroller,Uikit,Statusbar,我正在演示一个带有交互式转换的模态UINavigationController。父视图控制器有一个暗状态栏,而模态视图控制器有一个亮状态栏。我正在使用基于iOS 7 view controller的状态栏外观配置 只要我以非交互方式显示和关闭视图控制器,所有这些都可以正常工作。但是,当我启动交互式关闭转换并取消它时,状态栏的颜色仍为黑色 我创建了一个。点击“菜单”按钮,然后从屏幕右边缘平移,开始交互式转换 我尝试过的事情: 取消转换后,在涉及的任何导航和视图控制器上调用-setNeedsSta

我正在演示一个带有交互式转换的模态
UINavigationController
。父视图控制器有一个暗状态栏,而模态视图控制器有一个亮状态栏。我正在使用基于iOS 7 view controller的状态栏外观配置

只要我以非交互方式显示和关闭视图控制器,所有这些都可以正常工作。但是,当我启动交互式关闭转换并取消它时,状态栏的颜色仍为黑色

我创建了一个。点击“菜单”按钮,然后从屏幕右边缘平移,开始交互式转换

我尝试过的事情:

  • 取消转换后,在涉及的任何导航和视图控制器上调用
    -setNeedsStatusBarAppearanceUpdate
  • 将navigationBar.barStyle更改为
    UIBarStyleDefault
    并返回到
    UIBarStyleBlack
我还验证了模态导航控制器的statusBarStyle设置是否正确:

(lldb) p (UIStatusBarStyle) [[[[[UIApplication sharedApplication] keyWindow] rootViewController] presentedViewController] preferredStatusBarStyle]
(UIStatusBarStyle) $8 = UIStatusBarStyleLightContent
不过,状态栏是黑色的


你知道我可以尝试什么吗?

对我来说,这看起来像是
UINavigationController
中的一个bug()。取消解雇后,
UINavigationController
不会再次查询其
presentedViewController
中的
preferredStatusBarStyle
,而是从自身使用
preferredStatusBarStyle
。我通过覆盖
-childViewControllerForStatusBarStyle
解决了这个问题:

- (UIViewController*)childViewControllerForStatusBarStyle {
    if (self.presentedViewController) {
        return self.presentedViewController.childViewControllerForStatusBarStyle;
    }

    return [super childViewControllerForStatusBarStyle];
}
然后,为了在解雇期间(而不是之后)对更改进行动画处理,我还重写了
-preferredStatusBarStyle

我把解决办法推到了最后

别忘了打电话

[self.transitionContext cancelInteractiveTransition];
在您的UIPercentDrivenInteractiveTransition子类中
-(void)cancelInteractiveTransition
实现。这是我的灵感来源

- (void)cancelInteractiveTransition {

id<UIViewControllerContextTransitioning> transitionContext = self.transitionContext;
[transitionContext cancelInteractiveTransition];

UIView *fromView = [UIViewController fromViewForTransitioningContext:transitionContext];
UIView *toView = [UIViewController toViewForTransitioningContext:transitionContext];

if (self.presenting)
{
    CGRect endFrame = CGRectOffset([[transitionContext containerView] bounds], 0, CGRectGetHeight([[transitionContext containerView] bounds]));

    [UIView animateWithDuration:ANIMATION_DURATION_PAN animations:^{

        toView.frame = endFrame;

    } completion:^(BOOL finished) {

        [transitionContext completeTransition:NO];
    }];
}
else {

    CGRect endFrame = [[transitionContext containerView] bounds];

    [UIView animateWithDuration:ANIMATION_DURATION_PAN animations:^{
        fromView.frame = endFrame;
    } completion:^(BOOL finished) {
        [transitionContext completeTransition:NO];
    }];
}
-(无效)取消交互转换{
id transitionContext=self.transitionContext;
[transitionContext取消交互转换];
UIView*fromView=[UIViewController fromViewforTransitionContext:transitionContext];
UIView*toView=[UIViewController到ViewforTransitionContext:transitionContext];
如果(自我介绍)
{
CGRect endFrame=CGRectOffset([[transitionContext containerView]边界],0,CGRectGetHeight([[transitionContext containerView]边界]);
[UIView animateWithDuration:ANIMATION\u DURATION\u PAN动画:^{
toView.frame=endFrame;
}完成:^(布尔完成){
[transitionContext completeTransition:否];
}];
}
否则{
CGRect endFrame=[[transitionContext containerView]边界];
[UIView animateWithDuration:ANIMATION\u DURATION\u PAN动画:^{
fromView.frame=结束帧;
}完成:^(布尔完成){
[transitionContext completeTransition:否];
}];
}
}


编辑:这似乎对iOS 8.4有所帮助。按7.1测试,但不可能。也许苹果最近修复了它。

完全有道理。然而,当presentedViewController还不是零,但转换刚刚完成时,我在这里遇到了某种冲突。因此,基本上preferredStatusBarStyle是在目标控制器[interactive Disclose]的ViewDid出现之前查询的。根据您的示例项目,您在NVC中做了更多的工作,就像我假设的那样。谢谢你的样品!