【问题标题】:How to update the status bar style when transitioning to a new view controller?转换到新视图控制器时如何更新状态栏样式?
【发布时间】:2015-04-27 22:59:58
【问题描述】:

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

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

【问题讨论】:

    标签: ios cocoa-touch uistatusbar


    【解决方案1】:

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

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

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

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

    如果一切都失败了

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

    [[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleLightContent];

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

    希望这会有所帮助!

    【讨论】:

    • 我将 UIViewControllerBasedStatusBarAppearance 设置为 YES,所以我去了你的第二个解决方案。我实际上不需要把它放在整个宇宙中的每个视图控制器中。我刚刚将[self.currentViewController setNeedsStatusBarAppearanceUpdate] 添加到transitionFromViewController 的完成处理程序中。
    • 太棒了!是的,你可以从一堆方法中调用它。从您处理视图转换的位置调用它是有意义的。很高兴你把它修好了。
    猜你喜欢
    • 2018-05-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多