如何在iOS 9及以上版本中实现状态栏样式的动画变化

14

我之前使用的是:

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

要实现状态栏样式的动态变化,从深色到浅色或者反过来。

然而,自iOS 9以来,这种方法已经被弃用。

我改用了preferredStatusBarStyle,按照@serenn在preferredStatusBarStyle isn't called中的回答。它确实可以以传统方式更改状态栏样式,但没有动画效果。

文档中说:

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

然而,我不知道在哪里调用它,我尝试将其放在viewWillAppear中,但没有成功。

preferredStatusBarUpdateAnimation仍保持默认值:UIStatusBarAnimationFade

所以我很困惑。寻找如何像弃用的方法一样进行动画的答案。提前感谢!

1个回答

18

好的,我已经花了两个小时搜索和尝试,找到了解决方法:

首先,您必须确保您的子视图控制器可以通过覆盖preferredStatusBarStyle来控制导航控制器中的状态栏样式,就像@serenn在preferredStatusBarStyle isn't called中的答案一样。

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

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

viewAppeared 是一个布尔值,用于指示是否调用了 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甚至没有触发警告,因此,在苹果公司继续推动我改变之前,我不会使用这种方式。当时机成熟时,希望有一个好的解决方案。
我非常困惑为什么苹果公司废弃了一行代码([UIApplication sharedApplication] setStatusBarStyle]...)可以完成所有技巧,却使用更复杂的方式实现相同的结果。即使您想要更精细的控制,苹果公司也不必废弃旧代码。
但也许我现在还没有找到最好的方法。希望有人能启迪我。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接