如果我隐藏状态栏,然后重新出现,则导航栏的位置会向上移动

时间:2012-01-30 17:40:32

标签: ios

我遇到的问题是状态栏被隐藏然后重新出现 - 这样做会改变导航栏的位置,使其不会显示在状态栏下方,而是显示在其后面。即不再能看到导航栏的顶部,因为状态栏位于其上方。

我的程序是这样构建的,我有一个根视图控制器,显示状态栏和导航栏,视图控制器包含在导航控制器中,即

UINavigationController *navController = [[UINavigationController alloc] initWithRootViewController:self.myTableViewController];
self.window.rootViewController = navController;

视图控制器包含一个表视图,如果用户选择一行,则创建另一个控制器并将其推送到导航控制器的堆栈。

这个新的视图控制器会隐藏状态栏并隐藏导航栏,除非用户点击屏幕,在这种情况下会出现导航栏(并且它也是半透明的,它不在父视图控制器中)。 p>

我的问题是,当用户从此视图控制器导航回表视图控制器时,导航栏现在显示在状态栏后面。

我在表视图的viewWillAppear中有以下代码:我认为应该将所有内容重置为原来的样式。

- (void)viewWillAppear:(BOOL)animated
{    
    [[UIApplication sharedApplication] setStatusBarHidden: NO withAnimation: UIStatusBarAnimationFade];
    self.navigationController.navigationBar.translucent = NO;
    [self.navigationController setNavigationBarHidden:NO animated:YES];

为了重新显示表格视图,为什么导航栏会显示在状态栏后面?

由于

2 个答案:

答案 0 :(得分:3)

我相信状态栏大约是20px高,所以将navigationBar的origin.y设置为20,它应该修复它。我知道这很烦人,但这似乎是根据我的经验修复它的唯一方法。

当你的应用程序退出后台状态时,还要检查navigationBar的位置,我知道我的导航栏在到达前台时会立即恢复到状态栏下。

答案 1 :(得分:0)

我遇到了同样的问题,在堆栈溢出和测试上尝试了很多goole之后,找到了解决问题的方法。我认为问题是由于视图的边界发生了变化(例如,当你隐藏状态栏时,视图的边界会发生变化)

(在我的项目中,不仅隐藏了状态栏,还隐藏了导航控制器的导航栏。)

需要以下代码:

- (id)init
{
    self = [super init];
    if (self) {
        [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(test) name:UIApplicationWillEnterForegroundNotification object:nil];
    }
    return self;
}
-(void)dealloc
{
    [[NSNotificationCenter defaultCenter] removeObserver:self];
    [super dealloc];
}

- (void)test
{
    // the point is UIApplicationWillEnterForegroundNotification notification process
    // function should be called before all view controller delegate function being 
    // called, then we make all status bar and navigation bar show to restore the view's 
    // bounds, view contrller's view's bound should correct, then hide will not shift up
    [self showStatusBarAndNaviBar];
    [self performSelector:@selector(hideStatusBarAndNaviBar) withObject:self afterDelay:1.0];
}

//two custom function for use
- (void)hideStatusBarAndNaviBar
{
    [UIView animateWithDuration:2.0f
                      delay:0.0f
                    options:UIViewAnimationOptionAllowUserInteraction
                 animations:^(void) {
                     self.navigationController.navigationBar.alpha = 0.0f;
                     [[UIApplication sharedApplication] setStatusBarHidden:YES];
                 }
                 completion:^(BOOL finished){}];
}

- (void)showStatusBarAndNaviBar
{
    [UIView animateWithDuration:1.0f
                      delay:0.0f
                    options:UIViewAnimationOptionAllowUserInteraction
                 animations:^(void) {
                     self.navigationController.navigationBar.alpha = 1.0f;
                     [[UIApplication sharedApplication] setStatusBarHidden:NO];
                 }
                 completion:^(BOOL finished){}];
}