首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >多窗口的UIStatusBar外观

多窗口的UIStatusBar外观
EN

Stack Overflow用户
提问于 2014-05-28 15:08:43
回答 2查看 1.6K关注 0票数 6

首先,我的应用程序的设置:

大多数应用程序的视图控制器都存在于您的标准导航控制器层次结构中,但是我在主应用程序窗口上还有第二个窗口,它承载了一个视图控制器(NotificationVC)。如果NotificationVC提供通知,它将更改状态栏样式以与通知形成对比,但否则它会将样式提交给主窗口的根视图控制器。

我的问题是,主窗口中通常会触发状态栏外观更新(推送、弹出或显示视图控制器或调用-[UIViewController setNeedsStatusBarAppearanceUpdate]) 的更改对没有任何影响。

以下是来自NotificationVC的相关代码

代码语言:javascript
复制
@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:])是这个应用程序不可接受的解决方案。

EN

回答 2

Stack Overflow用户

发布于 2014-05-28 15:08:43

这似乎是UIViewController的一个优化--如果它不在顶部窗口,它不会触发更新。

我能够解决这个问题,方法是为一个知道通知视图控制器窗口的人提供UIViewControllersetNeedsStatusAppearanceUpdate实现。

代码语言:javascript
复制
@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

票数 1
EN

Stack Overflow用户

发布于 2014-05-28 15:33:10

假设屏幕上有3个视图控制器,vc1 vc2 vc3,它们实现的preferredStatusBarStyle外观不同。为了使状态栏能够接受vc1设置的外观,需要调用:

代码语言:javascript
复制
[vc1 setNeedsStatusBarAppearanceUpdate]

当然,ViewController也可以触发自己:

代码语言:javascript
复制
[self setNeedsStatusBarAppearanceUpdate]

当您想切换到另一个ViewController的布局时,可以在该视图控制器上调用setNeedsStatusBarAppearanceUpdate

作为额外的奖励,您可以将这些更改动画化如下:

代码语言:javascript
复制
[UIView animateWithDuration:0.3 animations:^{
    [self setNeedsStatusBarAppearanceUpdate];
}];
票数 -2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23915392

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档