导航栏出现在状态栏下方

13

我试图制作一个类似于Photos应用程序的界面,其中状态栏和导航栏会淡入淡出,但我遇到了一个问题。如果我点击以隐藏界面,然后旋转设备,再次点击以将其带回,那么导航栏就会重新定位到状态栏下方(参见照片)。如果我随后旋转设备,导航栏会回到它的正确位置。我该如何解决这个问题?

alt text

6个回答

32
这可能有点晚了,但我刚遇到了完全相同的问题。我正在设计一个全屏阅读器视图,其中状态栏、导航栏和工具栏都是透明的,你可以通过在屏幕中心轻击来淡入淡出。
我成功解决它的方法非常简单,基本上问题的核心是: 当您旋转视图并且NavigationController重新计算其新位置时,它认为应该位于窗口顶部,因为状态栏被隐藏。之后,当您同时显示状态栏和导航栏时,它们会重叠。
解决这个问题的方法非常简单,只需保留一个BOOL以记住您的覆盖层是显示还是隐藏,并在您的ViewController中实现willRotateToInterfaceOrientation和willAnimateRotationToInterfaceOrientation两个方法即可。
- (void)willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration
{
    if (!isOverlayShowing)
    {
        [[UIApplication sharedApplication] setStatusBarHidden:NO];
    }
    [super willRotateToInterfaceOrientation:toInterfaceOrientation duration:duration];
}

- (void)willAnimateRotationToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration
{
    if (!isOverlayShowing)
    {
        [[UIApplication sharedApplication] setStatusBarHidden:YES];
    }
    [super willAnimateRotationToInterfaceOrientation:toInterfaceOrientation duration:duration];
}

通过快速显示和隐藏这两种方法中的StatusBar,StatusBar会在NavigationBar重新计算其位置的确切时刻显示出来。我不知道这是否是解决此问题的最佳实现方式,但到目前为止,这种方法有效,并且不会在屏幕上产生任何闪烁,非常流畅。
我希望有同样问题的其他人能够偶然发现这篇文章,并找到这个简单的解决方案。

8
谢谢。这让我感到非常烦恼。 - bdmontz
3
哇,太棒了,这就是我一直在寻找的解决方案!我的问题是,如果用户关闭应用程序、旋转设备并重新启动应用程序,我会得到一个重叠的状态栏。我甚至没有想到,也许重新启动时子视图上的旋转事件正在被触发。这个方法解决了我的问题! - Shizam

2

很遗憾,这有点烦人。当隐藏状态栏时,它基本上会打开那个空间供uiviewcontrollers使用。启用自动调整大小后,它将基本上移入该空间,因为它不知道您将要再次使用该空间。

最好的方法是手动调整视图大小,以便当状态栏再次出现时,您也将视图压缩,使其正确地定位在状态栏下方。


2
另一个(更简单的)解决方案是在再次显示状态栏时重置顶层视图的框架;例如:
- (void)exitFullScreenMode
{
    [[UIApplication sharedApplication] setStatusBarHidden:NO withAnimation:UIStatusBarAnimationNone];

    // work-around for navigation bar appearing under status bar - must be called before -setNavigationBarHidden:
    self.view.window.rootViewController.view.frame = [UIScreen mainScreen].applicationFrame;

    [self.navigationController setNavigationBarHidden:NO animated:NO];
}

1

我在隐藏导航栏时遇到了将alpha设置为0的问题。所以显然,在调用以下代码后:

[[UIApplication sharedApplication] setStatusBarHidden:YES withAnimation:UIStatusBarAnimationFade];

你可以通过调用hidden方法将navigationBar移除,并将其重新插入视图中,然后将alpha设置为0来隐藏它:
//hiding and showing to redraw navigationBar over the status bar
self.navigationController.navigationBarHidden = YES;
self.navigationController.navigationBarHidden = NO;
self.navigationController.navigationBar.alpha = 0;

这将解决状态栏占用的额外空间。

0
if ( self.navigationController.navigationBarHidden )
{
    /******* Cancel Fullscreen ****/
    if ( UI_USER_INTERFACE_IDIOM() != UIUserInterfaceIdiomPad )
        [[UIApplication sharedApplication] setStatusBarHidden:NO withAnimation:UIStatusBarAnimationFade];

    [self.navigationController setNavigationBarHidden:NO animated:YES];
    [self.navigationController setToolbarHidden:NO animated:YES];
}
else {
    /******* Enable Fullscreen ****/
    if ( UI_USER_INTERFACE_IDIOM() != UIUserInterfaceIdiomPad )
        [[UIApplication sharedApplication] setStatusBarHidden:YES withAnimation:UIStatusBarAnimationFade];

    [self.navigationController setNavigationBarHidden:YES animated:YES];
    [self.navigationController setToolbarHidden:YES animated:YES];
}

0

通过以下方式解决了这个问题:

    [[UIApplication sharedApplication] setStatusBarHidden:NO withAnimation:UIStatusBarAnimationFade];

    self.navigationController.navigationBarHidden = YES;
    self.navigationController.navigationBarHidden = NO;

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接