转换到新视图控制器时如何更新状态栏样式?

时间:2015-04-27 22:59:58

标签: ios cocoa-touch uistatusbar

我有一个容器视图控制器,它使用以下代码从一个子视图控制器转换到另一个子视图:

- (void)switchToNewViewController:(UIViewController *)newController {
  [self 
    transitionFromViewController:self.currentViewController 
    toViewController:newController
    duration: 0.6
    options:UIViewAnimationOptionTransitionFlipFromLeft
    animations:^{
      newController.view.frame = self.currentViewController.view.frame;
    }
    completion:^(BOOL finished) {
      [self.currentViewController removeFromParentViewController];
      [newController didMoveToParentViewController:self];
      self.currentViewController = newController;
    }
  ];
}

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

当第一个视图控制器更喜欢状态栏中的深色文本但下一个视图控制器更喜欢浅色文本时,我遇到了问题。

第一个视图控制器:

- (UIStatusBarStyle)preferredStatusBarStyle
{
    return UIStatusBarStyleDefault;
}

第二个视图控制器:

- (UIStatusBarStyle)preferredStatusBarStyle
{
    return UIStatusBarStyleLightContent;
}

我在第一个和第二个视图控制器的preferredStatusBarStyle中都放了一个断点。调试器仅在第一个视图控制器上中断,但在第二个视图控制器上不中断。因此,状态栏样式不会更改。我如何通知Cocoa框架它需要读取第二个视图控制器的首选项?

1 个答案:

答案 0 :(得分:1)

确保UIViewControllerBasedStatusBarAppearance文件中的YES设置为Info.plist。这应确保每个视图控制器调用preferredStatusBarStyle

如果失败,请将上面的plist键设置为NO,然后将以下内容添加到每个UIViewController实现文件中的viewWillAppear

if ([self respondsToSelector:@selector(setNeedsStatusBarAppearanceUpdate)]) { [self setNeedsStatusBarAppearanceUpdate]; }

您需要确保在每个需要更新状态栏外观的视图控制器中实现此功能。

如果其他所有方法都失败

从您想要更新状态栏样式的任何位置调用以下命令:

[[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleLightContent];

显然用您想要的状态栏样式替换样式。

希望这有帮助!