在iOS 7上,如果我使用的话 prefersStatusBarHidden
方法并返回一个可以更改的实例变量:
- (BOOL)prefersStatusBarHidden {
return self.statusBarShouldBeHidden;
}
并且我更改了实例变量,从而隐藏了状态栏,导航栏丢失了状态栏占据的高度的20pt。但是,我不想要这个。是否可以隐藏状态栏 但要保持导航栏的高度?
在iOS 7上,如果我使用的话 prefersStatusBarHidden
方法并返回一个可以更改的实例变量:
- (BOOL)prefersStatusBarHidden {
return self.statusBarShouldBeHidden;
}
并且我更改了实例变量,从而隐藏了状态栏,导航栏丢失了状态栏占据的高度的20pt。但是,我不想要这个。是否可以隐藏状态栏 但要保持导航栏的高度?
导航栏保持其高度,只是导航栏和状态栏之间没有任何分隔符(并且具有相同的背景),所以它们看起来是一回事,实际上它们是两个。所以你真正想要的是导航栏扩展以占用导航栏和状态栏以前占用的空间。
之前我已经这样做了(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;
}
我在以下博文中找到了解决此问题的方法: 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:
构建导航控制器以使用新类时。
我没有得到@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开始。