首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何让UINavigationController中的导航栏在隐藏状态栏时更新其位置?

如何让UINavigationController中的导航栏在隐藏状态栏时更新其位置?
EN

Stack Overflow用户
提问于 2010-03-07 03:45:30
回答 4查看 10.6K关注 0票数 17

我有一个带有可见导航栏的UINavigationController。我有一个特殊的UIViewController,我想在推送到导航堆栈中时隐藏状态栏。一旦这个viewController弹出,我想再次显示状态栏。

我将这个栏隐藏在UIViewControllerviewWillAppear方法中,如下所示:

- (void) viewWillAppear:(BOOL)animated {

    [super viewWillAppear:animated];

    [self.navigationController setWantsFullScreenLayout:YES];
    [[UIApplication sharedApplication] setStatusBarHidden:YES animated:YES];    
}

请注意,为了清楚起见,我在这里设置了setWantsFullScreenLayout:YES,但实际上我只是在接口生成器中设置此属性。

问题: NavigationController的导航栏没有向上移动来占据现在隐藏的状态栏空间。

A hacky解决方案我发现唯一能刷新导航栏位置的方法是隐藏它,然后再次显示它,如下所示:

[[UIApplication sharedApplication] setStatusBarHidden:YES animated:YES];
[self.navigationController setNavigationBarHidden:YES animated:NO];
[self.navigationController setNavigationBarHidden:NO animated:NO];

但这显然是一种黑客行为,一定有更好的方法。

其他我尝试过的东西:

  1. 我尝试在隐藏状态栏后调用[super viewWillAppear],即在我的方法的末尾。
  2. 我尝试在navigationController.view上使用setNeedsLayout,如下所示:

[UIApplication sharedApplication setStatusBarHidden:YES动画:YES];self.navigationController.view self.navigationController.view

但这似乎并不管用。

感谢您的帮助。谢谢

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2011-03-30 14:38:34

有两种方法可以做你所要求的事情。

一种是手动移动导航栏:

在viewWillAppear中:

    [UIApplication sharedApplication].statusBarHidden = YES;
    self.view.frame = [UIScreen mainScreen].applicationFrame;
    CGRect frame = self.navigationController.navigationBar.frame;
    frame.origin.y = 0;
    self.navigationController.navigationBar.frame = frame;

在viewWillDisappear中:

    [UIApplication sharedApplication].statusBarHidden = NO;
    CGRect frame = self.navigationController.navigationBar.frame;
    frame.origin.y = 20.0;
    self.navigationController.navigationBar.frame = frame;

如果你也愿意关闭导航栏,事情也会变好,尽管我怀疑这不是你想要的:

    [UIApplication sharedApplication].statusBarHidden = YES;
    self.navigationController.navigationBarHidden = YES;
票数 10
EN

Stack Overflow用户

发布于 2010-04-15 00:33:27

在隐藏StatusBar之后,您应该尝试调整UIViewControllers's视图的框架大小。applicationFrame在setStatusBarHidden:animated:方法期间更新它的origin.y和size.height。

CGRect rect = [UIScreen mainScreen].applicationFrame;
self.view.frame = rect;

[self.view setNeedsLayout];
票数 2
EN

Stack Overflow用户

发布于 2012-08-30 04:35:10

我发现当视图处于动画演示的中间时,上面的解决方案不太有效,所以我推迟了隐藏状态栏的操作,如下所示:

-(void)viewWillAppear:(BOOL)animated
{
    [super viewWillAppear:animated];

    // doesn't work immediately because modal view has to finish loading
    dispatch_async(dispatch_get_main_queue(), ^(){
        [[UIApplication sharedApplication] setStatusBarHidden:YES];
        self.view.frame = [UIScreen mainScreen].applicationFrame;
    });
}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2393868

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档