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

时间:2014-01-24 15:30:42

标签: ios cocoa-touch uiviewcontroller uikit statusbar

我正在呈现一个带有交互式解除过渡的模态UINavigationController。父视图控制器具有暗状态栏,模态视图控制器具有亮状态栏。我正在使用基于iOS 7视图控制器的状态栏外观配置。

只要我呈现并以非交互方式关闭视图控制器,一切正常。但是,当我启动交互式关闭转换并取消它时,状态栏颜色仍然很暗。

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

我尝试过的事情:

  • 在转换取消后,在任何导航和视图控制器上调用-setNeedsStatusBarAppearanceUpdate
  • 将navigationBar.barStyle更改为UIBarStyleDefault并返回UIBarStyleBlack

我还验证了我的模态导航控制器的statusBarStyle设置正确:

(lldb) p (UIStatusBarStyle) [[[[[UIApplication sharedApplication] keyWindow] rootViewController] presentedViewController] preferredStatusBarStyle]
(UIStatusBarStyle) $8 = UIStatusBarStyleLightContent

状态栏仍为黑色。

还有什么可以尝试的吗?

2 个答案:

答案 0 :(得分:6)

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

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

    return [super childViewControllerForStatusBarStyle];
}

然后,为了在解雇期间(而不是之后)对变化进行动画制作,我也覆盖了-preferredStatusBarStyle

我将解决方法推送到sample project

答案 1 :(得分:0)

不要忘记致电

[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];
    }];
}

}

编辑:这似乎对iOS 8.4有所帮助。测试7.1但没办法。也许Apple最近修了它。