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

时间:2013-12-10 01:31:07

标签: ios objective-c ios7

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

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

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

3 个答案:

答案 0 :(得分:8)

我在以下博文中找到了一个解决这个问题的方法: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:以使用新类。

答案 1 :(得分: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;
}

答案 2 :(得分:0)

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