好的,我已经花了两个小时搜索和尝试,找到了解决方法:
首先,您必须确保您的子视图控制器可以通过覆盖preferredStatusBarStyle
来控制导航控制器中的状态栏样式,就像@serenn在preferredStatusBarStyle isn't called中的答案一样。
为了有动画效果,我必须返回视图控制器出现前后两种不同的样式,如下所示:
-(UIStatusBarStyle)preferredStatusBarStyle {
if (!viewAppeared)
return UIStatusBarStyleDefault;
else
return UIStatusBarStyleLightContent;
}
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];
}];
我曾经发现你不必像下面这样先调用 preferredStatusBarStyle
,setNeedsStatusBarAppearanceUpdate
会再次调用 preferredStatusBarStyle
:
[UIView animateWithDuration:0.8 animations:^{
[self preferredStatusBarStyle];
[self setNeedsStatusBarAppearanceUpdate];
}];
尽管这个解决方案可以解决问题,但我现在不选择使用它。只需要一行代码就可以得到相同的结果,但是我必须要写很多代码。目前,弃用的API甚至没有触发警告,因此,在苹果公司继续推动我改变之前,我不会使用这种方式。当时机成熟时,希望有一个好的解决方案。
我非常困惑为什么苹果公司废弃了一行代码(
[UIApplication sharedApplication] setStatusBarStyle]...
)可以完成所有技巧,却使用更复杂的方式实现相同的结果。即使您想要更精细的控制,苹果公司也不必废弃旧代码。
但也许我现在还没有找到最好的方法。希望有人能启迪我。