UINavigationBar出现在StatusBar下

时间:2010-11-20 02:41:13

标签: iphone ios4

我正在尝试创建一个类似于照片应用程序的界面,状态栏和状态栏。导航栏淡入/淡出但我遇到了问题。如果我点击隐藏界面然后旋转设备,然后点击将其重新启动,然后导航栏重新定位在状态栏下方(见照片)。如果我然后旋转设备,导航栏将返回到正确的位置。我该如何解决这个问题?

alt text

6 个答案:

答案 0 :(得分: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重新计算其位置的确切时刻显示。我不知道这是否是解决此问题的最佳方法,但到目前为止,这种方法有效并且不会在屏幕上产生任何闪烁并且非常流畅。

我希望有问题的其他人可能偶然发现这个帖子并找到解决这个问题的简单方法。

答案 1 :(得分:3)

另一个(更简单的)解决方案是在再次显示状态栏时重置顶级视图的框架; e.g。

- (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];
}

答案 2 :(得分:1)

不幸的是,它有点烦人。隐藏状态栏时,它基本上打开了uiviewcontrollers使用的空间。通过自动调整,它基本上会进入该空间,因为它不知道您将再次想要使用该空间。

最好的办法是手动调整视图大小,以便再次显示状态栏时,还可以向下查看视图,使其正确定位在状态栏下方。

答案 3 :(得分:1)

我在设置导航栏的alpha = 0时隐藏了它。显然,在打电话之后:

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

您可以通过调用hidden并将其重新插入视图然后设置alpha = 0来删除navigationBar:

//hiding and showing to redraw navigationBar over the status bar
self.navigationController.navigationBarHidden = YES;
self.navigationController.navigationBarHidden = NO;
self.navigationController.navigationBar.alpha = 0;

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

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

答案 5 :(得分:0)

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

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

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