隐藏UINavigationBar和状态栏问题

时间:2013-03-07 09:20:15

标签: ios objective-c

我正在尝试隐藏我的NavigationBar和状态栏(向上滑动动画),我遇到了一个问题。

当状态栏可见时,位于0点(x:0)的每个元素的原点意味着位于状态栏下方。但是,当隐藏状态栏时,0(x:0)点会更新以容纳新空间,0(x:0)表示屏幕的绝对顶部。

当我隐藏状态栏并旋转到横向时,视图会自动调整并移动所有内容以使用状态栏的空间,并抛出我的动画:

if (![[UIApplication sharedApplication] isStatusBarHidden]) {
            // Change to fullscreen mode
            // Hide status bar and navigation bar
            [[UIApplication sharedApplication] setStatusBarHidden:YES
                                                    withAnimation:UIStatusBarAnimationSlide];
            [UIView animateWithDuration:animationDuration animations:^{
                navBar.frame = CGRectMake(navBar.frame.origin.x,
                                          -navBar.frame.size.height-20,
                                          navBar.frame.size.width,
                                          navBar.frame.size.height);
            } completion:^(BOOL finished) {
                [navBar setHidden:TRUE];
            }];
        } else {
            // Change to regular mode
            // Show status bar and navigation bar

            [navBar setHidden:FALSE];

            [[UIApplication sharedApplication] setStatusBarHidden:NO
                                                    withAnimation:UIStatusBarAnimationSlide];
            [UIView animateWithDuration:animationDuration animations:^{
                navBar.frame = CGRectMake(navBar.frame.origin.x,
                                              0,
                                              navBar.frame.size.width,
                                              navBar.frame.size.height);
            } completion:^(BOOL finished) {

            }];
        }

有什么建议吗?

编辑:以下是轮播重播后屏幕的样子:Image

1 个答案:

答案 0 :(得分:1)

你将屏幕的细分混淆到了UIView区域。

当您在导航控制器中时,有三种视图:

  • 导航控制器的“根”视图
  • 在里面,NavigationBar(当然是UIView
  • 同样位于导航控制器内部的“内容区域”视图

因此Nav控制器正在管理它自己的根视图。因为它在顶部填充了一个NavigationBar,而其余的区域内部有一个大的UIView。

当您将您的视图控制器推送到导航堆栈时,Nav控制器正在添加您的根视图作为内容。因此,您的整个“self.view”完全包含在Nav控制器的“内容”视图中。

当然,当Nav控制器隐藏导航栏时......“内容”视图会向上扩展以填充空间。然后该视图告诉您的视图“嘿,有比您使用的空间更多的空间,因此您的视图也会扩展为完全填充Nav控制器的内容视图。

因此,您的视图的“0”点始终是您的视图的顶部。这永远不会改变。更改的是“视图顶部”相对于屏幕顶部边缘的位置。

如果您想要在删除导航栏时将内容保留在屏幕上的同一位置,那么您将不得不考虑到现在您的“零”点高于导航栏时的“零”点这一事实推送内容视图。