在 iOS 7 中,如果我使用 `prefersStatusBarHidden` 方法隐藏状态栏,导航栏会缩小/失去高度。我可以停止这种行为吗?

Posted

技术标签:

【中文标题】在 iOS 7 中,如果我使用 `prefersStatusBarHidden` 方法隐藏状态栏,导航栏会缩小/失去高度。我可以停止这种行为吗?【英文标题】:In iOS 7 if I hide the status bar with the `prefersStatusBarHidden` method, the navigation bar shrinks/loses height. Can I stop this behaviour? 【发布时间】:2013-12-10 01:31:07 【问题描述】:

ios 7 上,如果我使用 prefersStatusBarHidden 方法并返回一个可以更改的实例变量:

- (BOOL)prefersStatusBarHidden 
    return self.statusBarShouldBeHidden;

并且我更改了实例变量,从而隐藏了状态栏,导航栏失去了状态栏占据的 20pt 高度。然而,我不想要这个。是否可以隐藏状态栏但保持导航栏的高度

【问题讨论】:

github.com/molon/MMDrawerController/blob/master/… 该链接将为您提供帮助。您只需要注意 [UINavigationBar+FixFrameAfterHideStatusBar] 类别。 【参考方案1】:

我在以下博文中找到了解决此问题的方法:http://www.factorialcomplexity.com/blog/2014/08/05/fixed-height-navigation-bar-on-ios7.html,但他的解决方案使用 UINavigationBar 上的方法调配,我觉得这没有吸引力。

更新:

我发现继承 UINavigationBar 并提供与 swizzled 解决方案类似的实现解决了这个问题(这里是 Swift,但在 Obj-C 中同样有效):

class MyNavigationBar: UINavigationBar 
    override func sizeThatFits(size: CGSize) -> CGSize 
        var size = super.sizeThatFits(size)
        if UIApplication.sharedApplication().statusBarHidden 
            size.height = 64
        
        return size
    

然后在故事板中更新导航栏的类,或者在构造导航控制器时使用initWithNavigationBarClass:toolbarClass: 以使用新类。

【讨论】:

非常干净简单的解决方案,非常感谢!即使将状态栏动画化仍然看起来很棒。 嘿 Alex 和 @Seabass 我正在使用这个解决方案,它工作得很好,但是标题和导航按钮有一些奇怪的动画。当显示状态栏时,它们会向下跳并动画。而当我隐藏它时则相反。任何想法如何解决这个问题?【参考方案2】:

导航栏保持高度,只是导航栏和状态栏之间没有任何分隔符(并且具有相同的背景),所以它们看起来是一回事,而实际上它们是两个。所以你真正想要的是让导航栏扩展以占用之前导航栏和状态栏占用的空间。

我以前做过这样的事情(heightCon 是一个 IBOutlet 到导航栏上的高度限制)。

-(IBAction)hideStatusBar:(id)sender 
    static BOOL hidden = YES;
    [[UIApplication sharedApplication] setStatusBarHidden:hidden withAnimation:UIStatusBarAnimationSlide];
    self.heightCon.constant = (hidden)? 64 : 44;
    [UIView animateWithDuration:0.35 animations:^
        [self.navBar layoutIfNeeded];
    ];
    hidden = ! hidden;

【讨论】:

你怎么能以这种方式隐藏状态栏?我只能用上面的方法。 @DougSmith,我还在 info.plist 文件中添加了一个条目,“基于视图控制器的状态栏外观”,值为 NO。这允许您使用上述代码将其关闭和打开。 @rdelmar,根据状态栏的可视性,导航栏将缩小到 44 像素,反之亦然。您可以添加这段代码以更好地了解它的工作原理。您将看到图像缩小。 [self.navigationController.navigationBar setBounds:CGRectMake(0, -50, 320,0)];[self.navigationController.navigationBar setBackgroundImage:[UIImage imageNamed:@"navbar"] forBarPosition:UIBarPositionTopAttached barMetrics:UIBarMetricsDefault]; 不过,如果我们在隐藏状态栏之前和之后打印导航栏框架高度,我们将在两种情况下都得到 44 像素,但在视觉上并非如此。如果将导航栏移到屏幕中间会更清楚。【参考方案3】:

我没有得到@rdelmar 解决方案来为我使用NSLayoutConstraint,但我用他的想法想出了这个非常简单的代码。

[[UIApplication sharedApplication] setStatusBarHidden:YES withAnimation:UIStatusBarAnimationSlide];
[UIView animateWithDuration:0.35
                      delay:0
                    options:UIViewAnimationOptionBeginFromCurrentState
                 animations:^
                             self.navigationBar.top = 20;
                 
                 completion:nil];

options:UIViewAnimationOptionBeginFromCurrentState 在这里非常重要,否则动画会很生涩,因为它从 0 开始。

【讨论】:

根据我的经验,您无法像使用 navigationBar.top 那样设置 struct 的值。这只是一个说明你在做什么而不包含大量 CGRect 代码的插图吗?

以上是关于在 iOS 7 中,如果我使用 `prefersStatusBarHidden` 方法隐藏状态栏,导航栏会缩小/失去高度。我可以停止这种行为吗?的主要内容,如果未能解决你的问题,请参考以下文章

在 iOS 9 上从表视图打开 safari 视图控制器并在 iOS 8 或 7 上在 safari 中打开

iOS 7中MAC地址使用问题[重复]

如何在 iOS 7+ 中使用当前 ViewController 设置 PresentingViewController

与 WKWebView 相关的 iOS 7 崩溃

为啥我不能在 iOS 7.0 中的 UIScrollView 中滚动?

ios 7中的重大位置更改事件-后台服务调用