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

How to update the status bar style when transitioning to a new view controller?

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

- (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 框架它需要读取第二个视图控制器的首选项?

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

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

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

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

如果一切都失败了

从任何要更新状态栏样式的地方调用以下命令:

[[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleLightContent];

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

希望对您有所帮助!