Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/113.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何设置自iOS 9以来状态栏样式更改的动画_Ios - Fatal编程技术网

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

如何设置自iOS 9以来状态栏样式更改的动画,ios,Ios,所以我以前用: [[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleLightContent animated:YES]; 要设置状态栏样式的动画,请从暗变为亮,反之亦然 但是,自iOS 9以来,此方法已被弃用 在@serenn的回答之后,我改为使用preferredStatusBarStyle 它确实可以以旧的方式更改

所以我以前用:

[[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleLightContent 
                                            animated:YES];
要设置状态栏样式的动画,请从暗变为亮,反之亦然

但是,自iOS 9以来,此方法已被弃用

在@serenn的回答之后,我改为使用
preferredStatusBarStyle

它确实可以以旧的方式更改状态栏样式,但不需要动画

文件说:

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

但我不知道该怎么称呼它,我试着把它放在视图中,但没有运气

preferredStatusBarUpdateAnimation
保留为默认值:
UIStatusBarAnimationFade


所以我很困惑。正在查找有关如何作为不推荐的方法设置动画的答案。提前谢谢

好的,我花了两个小时搜索和尝试,找到了答案:

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

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

-(UIStatusBarStyle)preferredStatusBarStyle {
    if (!viewAppeared)
        return UIStatusBarStyleDefault;
    else
        return UIStatusBarStyleLightContent; // your own style
}
视图显示
是一个BOOL,用于指示是否调用了
视图显示

- (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
,并将在
viewwillbeen中更改为
UIStatusBarStyleLightContent

然后调用
setneedssstatusbarappearanceupdate
更新如下更改,注意
animateWithDuration
是制作动画的必备条件

[UIView animateWithDuration:0.8 animations:^{
    [self setNeedsStatusBarAppearanceUpdate];
}];
我曾经发现您不必先调用
preferredStatusBarStyle
,如下图所示,
setneedssstatusbarappearanceupdate
将再次调用
preferredStatusBarStyle

[UIView animateWithDuration:0.8 animations:^{
    [self preferredStatusBarStyle];
    [self setNeedsStatusBarAppearanceUpdate];
}];
虽然这个解决方案解决了问题,但我现在不选择使用它。我可以用一行代码得到相同的结果,但是现在我要写的代码太多了。不推荐使用的API现在甚至不会触发警告,所以在苹果不断敦促我改变之前,我不会使用这种方式。到时候我希望有一个好的解决办法

我非常困惑,为什么苹果不赞成使用一行代码(
[UIApplication sharedApplication]setStatusBarStyle]…
),它可以完成所有的技巧,但使用更复杂的代码来实现相同的结果。即使您希望提供更细粒度的控制,苹果也不必反对旧的控制

但也许我现在没有找到最好的。希望有人能启发我