自iOS 9以来如何为状态栏样式更改设置动画

所以我以前用过:

[[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleLightContent animated:YES]; 

动画状态栏样式的变化,从暗到亮,反之亦然

但是,自iOS 9起,此方法已弃用。

我更改为使用preferredStatusBarStyle跟随@serenn在preferredStatusBarStyle中的答案未被调用

它确实可以改变旧式的状态栏样式,但没有动画。

文件说:

如果此方法的返回值发生更改,请调用setNeedsStatusBarAppearanceUpdate方法。

但是我不知道在哪里调用它,我试过把它放在viewWillAppear中,但没有运气。

preferredStatusBarUpdateAnimation仍为默认值: UIStatusBarAnimationFade

所以我很困惑。 寻找如何动画为已弃用方法的答案。 提前致谢!

好的,我花了两个小时搜索并尝试,想通了:

首先,你必须确保你的子视图控制器可以通过覆盖preferredStatusBarStyle来控制导航控制器中的状态栏样式,就像@serenn在preferredStatusBarStyle中的答案没有被调用一样

为了拥有动画,我必须在视图控制器出现之前和之后返回两种不同的样式,如下所示:

 -(UIStatusBarStyle)preferredStatusBarStyle { if (!viewAppeared) return UIStatusBarStyleDefault; else return UIStatusBarStyleLightContent; // your own style } 

viewAppeared是一个BOOL,用于指示是否调用viewWillAppear

 - (void)viewWillAppear:(BOOL)animated { [super viewWillAppear:animated]; viewAppeared = YES; [UIView animateWithDuration:0.8 animations:^{ [self setNeedsStatusBarAppearanceUpdate]; }]; } -(void)viewWillDisappear:(BOOL)animated { [super viewWillDisappear:animated]; viewAppeared = NO; } 

因此,当视图控制器没有出现时,状态栏样式为UIStatusBarStyleDefault ,并将在viewWillAppear更改为UIStatusBarStyleLightContent

然后调用setNeedsStatusBarAppearanceUpdate更新如下所示的更改,注意animateWithDuration是必须拥有动画。

 [UIView animateWithDuration:0.8 animations:^{ [self setNeedsStatusBarAppearanceUpdate]; }]; 

我曾经发现你不必像下面那样首先调用preferredStatusBarStylesetNeedsStatusBarAppearanceUpdate将再次调用preferredStatusBarStyle

 [UIView animateWithDuration:0.8 animations:^{ [self preferredStatusBarStyle]; [self setNeedsStatusBarAppearanceUpdate]; }]; 

虽然这个解决方案解决了这个问题,但我现在不选择使用它。 我只能使用一行代码获得相同的结果,但现在我需要写的代码太多了。 不推荐使用的API现在甚至都没有触发警告,所以在Apple不断推动我改变之前,我不会用这种方式。 到时候,我希望有一个很好的解决方案。

我很困惑为什么Apple弃用了可以做所有技巧的单行代码( [UIApplication sharedApplication] setStatusBarStyle]... ),但使用更复杂的方法来实现相同的结果。 即使您想要提供更细粒度的控制,Apple也不必弃用旧版本。

但也许我现在没找到最好的。 希望有人能够让我高兴。