iOS 9

时间:2015-10-29 04:18:33

标签: ios

所以我以前用过:

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

为状态栏样式更改设置动画,从暗到亮,反之亦然

但是,自iOS 9以来,这种方法已被弃用。

我更改为在preferredStatusBarStyle isn't called

中关注@ serenn的回答后使用preferredStatusBarStyle

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

文件说:

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

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

preferredStatusBarUpdateAnimation仍为默认设置:UIStatusBarAnimationFade

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

1 个答案:

答案 0 :(得分:16)

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

首先,您必须确保您的子视图控制器可以通过在preferredStatusBarStyle isn't called

中覆盖{@ 1}} @ serenn的答案来控制导航控制器中的状态栏样式

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

var divEditWrapper = document.createElement("div");
divEditWrapper.id = "divEditWrapper";
divEditWrapper.style.cssText = "bottom: 0px; left: 0px; overflow: hidden; overflow-x: auto;  position: absolute; right: 0px; top: 64px;";
divEdit.appendChild(divEditWrapper);

divDataHeaders = document.createElement("div");
divDataHeaders.style.cssText = "color: rgba(0,0,0,0.54); height: 54px; left: 0px; position: absolute; right: 0px; top: 0px; ";
divEditWrapper.appendChild(divDataHeaders);

divEditContent = document.createElement("div");
divEditContent.id = "divDataGridEditContent";
divEditContent.style.cssText = "bottom: 0px; overflow: hidden; overflow-y:auto; left: 0px; position: absolute; right: 0px; top: 54px;";
divEditWrapper.appendChild(divEditContent);

preferredStatusBarStyle是一个BOOL,用于指示是否调用了-(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

然后致电UIStatusBarStyleLightContent更新如下所示的更改,请注意viewWillAppear必须拥有动画。

setNeedsStatusBarAppearanceUpdate

我以前发现您不必像下面那样致电animateWithDuration[UIView animateWithDuration:0.8 animations:^{ [self setNeedsStatusBarAppearanceUpdate]; }]; 会再次调用preferredStatusBarStyle

setNeedsStatusBarAppearanceUpdate

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

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

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