我正在提供一个带有交互式解雇过渡的模态UINavigationController。父 View Controller 的状态栏为深色,模态视图 Controller 的状态栏为浅。我正在使用基于iOS 7 View Controller 的状态栏外观配置。

只要我非交互地显示和关闭 View Controller ,一切都可以正常工作。但是,当我启动一个交互式关闭转换并取消它时,状态栏的颜色仍然是深色的。

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

我尝试过的事情:

  • 取消转换后,在涉及的任何导航和 View Controller 上调用-setNeedsStatusBarAppearanceUpdate
  • 将navigationBar.barStyle更改为UIBarStyleDefault,然后再更改回UIBarStyleBlack

  • 我还验证了我的模式导航 Controller 的statusBarStyle设置正确:
    (lldb) p (UIStatusBarStyle) [[[[[UIApplication sharedApplication] keyWindow] rootViewController] presentedViewController] preferredStatusBarStyle]
    (UIStatusBarStyle) $8 = UIStatusBarStyleLightContent
    

    尽管如此,状态栏还是黑色的。

    还有其他想法我可以尝试吗?

    最佳答案

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

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

    然后,为了动画化解雇期间(而不是之后)的变化,我还重写了-preferredStatusBarStyle

    我将解决方法推送到sample project

    09-20 00:39