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


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

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

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


9671
2017-12-10 01:31


起源

github.com/molon/MMDrawerController/blob/master/... 该链接将帮助您。您只需要注意[UINavigationBar + FixFrameAfterHideStatusBar]类别。 - molon


答案:


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

之前我已经这样做了(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;
}

2
2017-12-10 01:49



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


我在以下博文中找到了解决此问题的方法: 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: 构建导航控制器以使用新类时。


8
2017-10-29 21:32



非常干净简单的解决方案,非常感谢!即使动画状态栏仍然看起来很棒。 - wolfrevo
嘿亚历克斯和@Seabass我正在使用这个解决方案,它工作得很好,但标题和导航按钮有一些奇怪的动画。当显示状态栏时,它们跳下并动画显示。当我隐藏它时,相反。任何想法如何解决这一问题? - Eeshwar
好方案!非常感谢你!!!!!! - Mihael Isaev


我没有得到@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开始。


0
2018-05-24 20:27



根据我的经验,您无法按照自己的方式设置struct的值 navigationBar.top。这只是一个例子来说明你在那里做了什么,而不包括很多CGRect代码? - Shawn Throop