从iOS 9开始,如何为状态栏样式更改设置动画

Win*_*ero 14 ios

所以我以前用过:

[[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleLightContent 
                                            animated:YES];
Run Code Online (Sandbox Code Playgroud)

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

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

我更改为使用preferredStatusBarStyle以下@serenn的答案,而不是调用preferredStatusBarStyle

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

文件说:

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

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

preferredStatusBarUpdateAnimation 仍为默认值:UIStatusBarAnimationFade

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

Win*_*ero 16

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

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

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

-(UIStatusBarStyle)preferredStatusBarStyle {
    if (!viewAppeared)
        return UIStatusBarStyleDefault;
    else
        return UIStatusBarStyleLightContent; // your own style
}
Run Code Online (Sandbox Code Playgroud)

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;
}
Run Code Online (Sandbox Code Playgroud)

所以,当视图控制器没有出现,状态栏样式UIStatusBarStyleDefault,并改为UIStatusBarStyleLightContentviewWillAppear.

然后调用setNeedsStatusBarAppearanceUpdate如下更新更改,注意animateWithDuration是必须有动画.

[UIView animateWithDuration:0.8 animations:^{
    [self setNeedsStatusBarAppearanceUpdate];
}];
Run Code Online (Sandbox Code Playgroud)

我曾经发现你不必preferredStatusBarStyle像下面那样setNeedsStatusBarAppearanceUpdate先调用,会preferredStatusBarStyle再次调用:

[UIView animateWithDuration:0.8 animations:^{
    [self preferredStatusBarStyle];
    [self setNeedsStatusBarAppearanceUpdate];
}];
Run Code Online (Sandbox Code Playgroud)

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

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

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