Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在iOS 7中,如果我使用'prefersStatusBarHidden'方法隐藏状态栏,导航栏会收缩/丢失高度。我能停止这种行为吗?_Ios_Objective C_Ios7 - Fatal编程技术网

在iOS 7中,如果我使用'prefersStatusBarHidden'方法隐藏状态栏,导航栏会收缩/丢失高度。我能停止这种行为吗?

在iOS 7中,如果我使用'prefersStatusBarHidden'方法隐藏状态栏,导航栏会收缩/丢失高度。我能停止这种行为吗?,ios,objective-c,ios7,Ios,Objective C,Ios7,在iOS 7上,如果我使用prefersStatusBarHidden方法并返回一个可以更改的实例变量: - (BOOL)prefersStatusBarHidden { return self.statusBarShouldBeHidden; } 我更改了实例变量,从而隐藏了状态栏,导航栏失去了状态栏占据的20磅高度。然而,我不想要这个。是否可以隐藏状态栏但保持导航栏的高度?导航栏保持其高度,只是导航栏和状态栏之间没有任何分隔符(并且具有相同的背景),所以它们看起来是一回事,而实际上

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

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

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

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

我以前也这样做过(heightCon是一个指向导航栏上高度约束的IBOutlet)


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

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

选项:UIViewAnimationOptionBeginFromCurrentState在这里非常重要,否则动画是不稳定的,因为它是从0开始的。

我在下面的博文中找到了一个解决这个问题的方法:但是他的解决方案使用了UINavigationBar上的方法Swizzing,我觉得这不吸引人

更新:

我发现子类化UINavigationBar并提供类似于swizzled解决方案的实现解决了这个问题(这里是Swift,但在Obj-C中也是如此):


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

如何以这种方式隐藏状态栏?我只能用上面的方法打开它。@DougSmith,我还在info.plist文件中添加了一个条目,“查看基于控制器的状态栏外观”,其值为“否”。这允许您用上面的代码关闭和打开它。@rdelmar,导航栏将收缩到44像素,反之亦然,根据状态栏的可视性。您可以添加这段代码,以便更好地了解其工作原理。您将看到图像缩小<代码>[self.navigationController.navigationBar setBounds:CGRectMake(0,-50320,0)];[self.navigationController.navigationBar setBackgroundImage:[UIImage ImageName:@“navbar”]forBarPosition:UIBarPositionTopAttached barMetrics:UIBarMetricsDefault]仍然,如果我们在隐藏状态栏之前和之后打印导航栏帧高度,我们将在这两种情况下获得44像素,但视觉上并非如此。如果您将导航栏移到屏幕中间,则更为清晰。根据我的经验,您不能像使用
navigationBar.top
那样设置struct的值。这只是一个演示,说明了您在那里做什么,而不包括很多CGRect代码吗?链接将帮助您。您只需支付[UINavigationBar+FixFrameAfterHideStatusBar]类别的费用。非常干净简单的解决方案,非常感谢!即使是设置状态栏的动画也很不错。嘿,Alex和@Seabass,我正在使用这个解决方案,效果很好,但是标题和导航按钮有一些奇怪的动画。当显示状态栏时,它们会跳下并向上设置动画。当我把它藏起来的时候正好相反。有没有办法解决这个问题?
[[UIApplication sharedApplication] setStatusBarHidden:YES withAnimation:UIStatusBarAnimationSlide];
[UIView animateWithDuration:0.35
                      delay:0
                    options:UIViewAnimationOptionBeginFromCurrentState
                 animations:^{
                             self.navigationBar.top = 20;
                 }
                 completion:nil];
class MyNavigationBar: UINavigationBar {
    override func sizeThatFits(size: CGSize) -> CGSize {
        var size = super.sizeThatFits(size)
        if UIApplication.sharedApplication().statusBarHidden {
            size.height = 64
        }
        return size
    }
}