UIStatusBar 不会消失。悲伤和沮丧随之而来

UIStatusBar will not go away. Sadness and frustration ensues

什么都试过了。只是试图为一个视图控制器隐藏它。

.plist:

Status bar is initially hidden = NO
View controller-based status bar appearance = YES

视图控制器:

- (BOOL)prefersStatusBarHidden {
    return YES;
}

//I shouldn't have to do this, the above method should suffice. Doesn't work anyway
- (void)viewWillAppear:(BOOL)animated{
    [super viewWillAppear:animated];
    [[UIApplication sharedApplication] setStatusBarHidden:YES];

}

没有任何效果。状态栏还在那里,盯着我的脸,笑着看它的丑陋。我需要做什么???

编辑:prefersStatusBarHidden 甚至没有被调用。此视图控制器通过 push segue 被推送到导航堆栈上。

这里的关键是它从未在视图控制器中被调用:

- (BOOL)prefersStatusBarHidden {
    return YES;
}

回溯,也没有在父导航控制器中调用。这是因为导航控制器属于根视图控制器。根视图控制器确实调用了这个方法,但没有将它传递给导航控制器,因此也没有传递给任何其他子视图控制器。因此,对于遇到相同问题并尝试调试的任何人,请尝试在层次结构的 "root" 处找到视图控制器。

所以在我的例子中,我 post 来自任何视图控制器 (viewWillAppear) 的通知,我想隐藏状态栏。此通知随后由根控制器使用:

- (void)hideStatusBar:(NSNotification *)notification {
    self.hideStatusBar = YES;
    [self setNeedsStatusBarAppearanceUpdate];
}

强制在根控制器上调用此方法:

- (BOOL)prefersStatusBarHidden {
    return self.hideStatusBar;
}

一切都按预期进行。同样可以再次显示状态栏。

在任何包含视图控制器的自定义中,实现 childViewControllerForStatusBarHidden,返回应控制状态栏外观的当前子视图控制器(在本例中为导航控制器)。

这将使系统按照视图控制器层次结构向下到当前 "top" 视图控制器,并且将查询该视图控制器的 prefersStatusBarHidden

在您的自定义包含视图控制器中,如果当前 "active" 子视图控制器发生变化,请调用 setNeedsStatusBarAppearanceUpdate 让系统知道。