在iPhone上如何隐藏单个视图的状态栏?

33

我想在我的应用程序中在所有视图中显示状态栏,但有一个视图除外。我尝试修改plist中的“状态栏最初隐藏”,也尝试过:

[[UIApplication sharedApplication] setStatusBarHidden:YES];

这将隐藏状态栏,但会留下一个丑陋的蓝色框,位于状态栏原来的位置上(这不是我的视图的一部分,上面没有蓝色内容)。

我还尝试在Xcode 4.2的“Interface Builder”中更改布局并设置全屏和状态栏设置。

有什么建议吗?

编辑 - 解决方案:

我已经通过包含以下内容解决了问题:

    -(void)viewWillDisappear:(BOOL)animated{


    [[UIApplication sharedApplication] setStatusBarHidden:YES];

}


-(void)viewDidAppear:(BOOL)animated{


    [[UIApplication sharedApplication] setStatusBarHidden:NO];

}

在我想要状态栏显示的每一页上。

由于选项卡栏每次切换视图时都会出现和消失,所以它看起来仍然很糟糕。但是我已经受够了,花了约5个小时解决这个愚蠢的问题,所以只能这样了。

第二次编辑 -

通过在viewWillAppear中包含setStatusBarHidden=NO解决了不连贯的问题。天知道一切是如何运作的,但它确实可以工作。


你的主视图背景是蓝色的吗?如果你去掉状态栏,你需要调整其他视图的大小来占据那个空间。 - fearmint
不,它是白色的,而且我认为我的所有视图大小都正确... 我想要隐藏的这个视图是选项卡栏和导航控制器的一部分,也许我在故事板中需要更改一些东西。 - Adam Waite
如果您在 viewDidLoad 中执行一些布局操作,那么该布局将假定状态栏已显示。因此最好在 viewDidLoad 中的第一件事就是隐藏它。 - Yevhen Dubinin
9个回答

42

尝试这个,它将完美运行。

[[UIApplication sharedApplication] setStatusBarHidden:YES];

在 XIB 中设置状态栏选项为 none。

iOS 7 上可用。

进入 info.plist,如果没有则添加两个属性。将“Status bar is initially hidden”设置为“YES”,将“UIViewControllerBasedStatusBarAppearance”设置为“NO”。这将隐藏您应用程序的状态栏。


我认为在您的情况下,设置 XIB 没有状态栏,并确保视图的大小覆盖状态栏所在的位置是您需要做的事情。如果您的 XIB 有状态栏,然后在代码中隐藏它,视图不一定会扩展以覆盖现在空白的区域。 - carbonbasednerd
设置xib的设置就解决了!!! 我只在init方法中设置了状态栏隐藏..而不是xib :P - jsetting32

17
#pragma mark - Hide statusbar

-(void)hideStatusBar {
#if __IPHONE_OS_VERSION_MIN_REQUIRED >= 70000
    // iOS 7.0 or later
    [self setNeedsStatusBarAppearanceUpdate];
#else
    // less than 7
    [[UIApplication sharedApplication] setStatusBarHidden:YES];
#endif
}

- (BOOL)prefersStatusBarHidden {
    return YES;
}

1
+1。太棒了!对于我的情况,只有- prefersStatusBarHidden就足够了 :) - Ja͢ck

8
如果上述解决方案不起作用(并且仍然存在一个恼人的20像素蓝色间隙),那么请尝试将以下内容放入希望隐藏状态栏的视图控制器的实现文件中的viewWillAppear方法中。
self.navigationController.navigationBar.frame = CGRectOffset(self.navigationController.navigationBar.frame, 0.0, -20.0);

实际上我花了大约12个小时才解决了这个问题,这就是解决方案,所以现在我想提醒其他人如果遇到这个烦人的问题。


那个解决方案对我有用,但是没有提供流畅的视图传统。这个对我来说效果更好: - T.J.
[UIView animateWithDuration:0.35f delay:0.0f options:UIViewAnimationOptionOverrideInheritedCurve animations:^{ self.navigationController.navigationBar.frame = CGRectOffset(self.navigationController.navigationBar.frame, 0.0, 20.0); } completion:nil]; - T.J.
1
我刚刚用更多的经验看了一年左右,这不是一个好的解决方案,尽管它起作用。只是一个警告。我正在修改我的答案,并标记Kartik的正确。 - Adam Waite
@T.J.,这很好用,但在20.0前面加上负号,即 [UIView animateWithDuration:0.35f delay:0.0f options:UIViewAnimationOptionOverrideInheritedCurve animations:^{ self.navigationController.navigationBar.frame = CGRectOffset(self.navigationController.navigationBar.frame, 0.0, -20.0); } completion:nil]; - JohnK

7

Kartik的解决方案对我有用。

[[UIApplication sharedApplication] setStatusBarHidden:YES];

我将这个代码添加到viewWillAppear:实例方法中。

- (void)viewWillAppear:(BOOL)animated
{
    [super viewWillAppear:animated];
    [[UIApplication sharedApplication] setStatusBarHidden:YES];
    self.webView.scalesPageToFit = YES;
    [self.webView loadRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:@"http://www.google.co.uk"]]];
}

我也花费了很长时间。使用Xcode 4.2,iOS5模拟器。

但是当我第一次实现它时,顶部的恼人的“空白”就出现了。我在故事板中选择了视图控制器并设置属性如下:

大小:全屏 状态栏:无 其他所有内容都推断出来。

我检查了想要全屏。

哇,一切都运行得很好。


请记住,虽然亚当的解决方案很好,但这就像把灰尘藏在地毯底下一样。你想要全屏,你不希望状态栏存在,而不仅仅是隐藏然后覆盖掉空间。 - WillShakes

2

我知道这是一个老问题,但是对我来说,这些答案都不起作用,所以这就是如何让我在单个视图控制器中隐藏状态栏的方法。

首先,在您的父视图控制器中,您必须设置:

- (UIViewController *)childViewControllerForStatusBarHidden {
    if ( hideStatusBarViewController ) {
        return hideStatusBarViewController;
    }
    return nil
}

只有在创建子视图控制器时,它才会返回子视图控制器,否则默认为nil。当您添加hideStatusBarViewController时,必须调用

[self setNeedsStatusBarAppearanceUpdate];

在 parentViewController 上,这个函数强制读取 childViewControllerForStatusBarHidden。最后在 hideStatusBarViewController 中,您必须设置

- (BOOL)prefersStatusBarHidden {
    return YES;
}

这是我唯一有效的解决方案。希望能对某些人有所帮助。


1
我建议您采用不同的方法:将该视图插入到应用程序窗口中:
YourUIAppDelegate *appDelegate = [UIApplication sharedApplication].delegate;
[appDelegate.window insertSubview:self.yourView atIndex:([[appDelegate.window subviews]count])];

这样它就会显示在状态栏上

希望能对你有所帮助


1
这是一个解决方案,如果您想在一个单独的视图中隐藏状态栏。
- (void)viewWillAppear:(BOOL)animated
{
    [super viewWillAppear:animated];

    [[UIApplication sharedApplication] setStatusBarHidden:YES];
    [self.view sizeToFit];
}

0
这里有一段代码片段可能会有所帮助。当视图加载时显示状态栏,当您离开视图时再次隐藏它。
-(void)viewWillAppear:(BOOL)animated {
    if([[UIApplication sharedApplication] respondsToSelector:@selector(setStatusBarHidden: withAnimation:)])
        [[UIApplication sharedApplication] setStatusBarHidden:NO withAnimation:UIStatusBarAnimationFade];
    else 
        [[UIApplication sharedApplication] setStatusBarHidden:NO animated:YES];
}


-(void)viewWillDisappear:(BOOL)animated  {
    if([[UIApplication sharedApplication] respondsToSelector:@selector(setStatusBarHidden: withAnimation:)])
        [[UIApplication sharedApplication] setStatusBarHidden:YES withAnimation:UIStatusBarAnimationFade];
    else 
        [[UIApplication sharedApplication] setStatusBarHidden:YES animated:YES];
}

很遗憾,这并没有帮助。无论如何还是谢谢。 - Adam Waite
只是提醒一下 - 上面的代码非常错误。应该更像这样:(void)viewWillAppear:(BOOL)animated { [super viewWillAppear:animated]; [[UIApplication sharedApplication] setStatusBarHidden:YES withAnimation:UIStatusBarAnimationFade]; } -(void)viewWillDisappear:(BOOL)animated { [super viewWillDisappear:animated]; [[UIApplication sharedApplication] setStatusBarHidden:NO withAnimation:UIStatusBarAnimationFade]; } - snibbe

-1

[[UIApplication sharedApplication] setStatusBarHidden:BOOL];就足够了,但是:

  1. 记得在离开视图之前将其设置回NO,否则返回的页面可能会在状态栏下面有导航栏。

  2. 确保在您想要隐藏状态栏的视图中同时设置状态栏的隐藏和显示。我在viewDidLoad方法中关闭了它,而且 - 至关重要的是 - 在viewWillDisappear:animated方法中重新打开。如果晚了,你就会遇到麻烦。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接