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

Dou*_*ith 11 objective-c ios ios7

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

- (BOOL)prefersStatusBarHidden {
    return self.statusBarShouldBeHidden;
}
Run Code Online (Sandbox Code Playgroud)

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

Ale*_*lav 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
    }
}
Run Code Online (Sandbox Code Playgroud)

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

  • 嘿亚历克斯和@Seabass我正在使用这个解决方案,它工作得很好,但标题和导航按钮有一些奇怪的动画.当显示状态栏时,它们跳下并动画显示.而当我隐藏它时相反.任何想法如何解决这一问题? (3认同)

rde*_*mar 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;
}
Run Code Online (Sandbox Code Playgroud)