首先,我的应用程序的设置:
大多数应用程序的视图控制器都存在于您的标准导航控制器层次结构中,但是我在主应用程序窗口上还有第二个窗口,它承载了一个视图控制器(NotificationVC)。如果NotificationVC提供通知,它将更改状态栏样式以与通知形成对比,但否则它会将样式提交给主窗口的根视图控制器。
我的问题是,主窗口中通常会触发状态栏外观更新(推送、弹出或显示视图控制器或调用-[UIViewController setNeedsStatusBarAppearanceUpdate]) 的更改对没有任何影响。
以下是来自NotificationVC的相关代码
@implementation NotificationVC
- (UIStatusBarStyle)preferredStatusBarStyle
{
if (self.isShowingNotification)
{
if (self.notificationView.hasDarkBackground)
{
return UIStatusBarStyleLightContent;
}
else
{
return UIStatusBarStyleDefault;
}
}
else
{
return [[UIApplication sharedApplication].delegate window].rootViewController.preferredStatusBarStyle;
}
}
@end如何从主窗口中的一个视图控制器中获得状态条以进行更新?
注意:手动设置状态栏外观(-[UIApplication setStatusBarStyle:])是这个应用程序不可接受的解决方案。
发布于 2014-05-28 15:08:43
这似乎是UIViewController的一个优化--如果它不在顶部窗口,它不会触发更新。
我能够解决这个问题,方法是为一个知道通知视图控制器窗口的人提供UIViewController的setNeedsStatusAppearanceUpdate实现。
@interface UIViewController (NotificationWindow)
@end
@implementation UIViewController (NotificationWindow)
+ (void)load
{
Method original = class_getInstanceMethod([UIViewController class], @selector(setNeedsStatusBarAppearanceUpdate));
Method swizzled = class_getInstanceMethod([UIViewController class], @selector(swiz_setNeedsStatusBarAppearanceUpdate));
method_exchangeImplementations(original, swizzled);
}
- (void)swiz_setNeedsStatusBarAppearanceUpdate
{
UIWindow *topWindow = [UIApplication sharedApplication].windows.lastObject;
if (![self.view.window isEqual:topWindow] && [topWindow.rootViewController isKindOfClass:[NotificationVC class]])
{
[[[UIApplication sharedApplication].windows.lastObject rootViewController] swiz_setNeedsStatusBarAppearanceUpdate];
}
else
{
[self swiz_setNeedsStatusBarAppearanceUpdate];
}
}
@end这有点麻烦--我试着避免使用swizzling --但它允许状态栏外观API按原样工作,而不要求所有其他视图控制器都知道NotificationVC。
发布于 2014-05-28 15:33:10
假设屏幕上有3个视图控制器,vc1 vc2 vc3,它们实现的preferredStatusBarStyle外观不同。为了使状态栏能够接受vc1设置的外观,需要调用:
[vc1 setNeedsStatusBarAppearanceUpdate]当然,ViewController也可以触发自己:
[self setNeedsStatusBarAppearanceUpdate]当您想切换到另一个ViewController的布局时,可以在该视图控制器上调用setNeedsStatusBarAppearanceUpdate。
作为额外的奖励,您可以将这些更改动画化如下:
[UIView animateWithDuration:0.3 animations:^{
[self setNeedsStatusBarAppearanceUpdate];
}];https://stackoverflow.com/questions/23915392
复制相似问题