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

edd*_*ddy 17 iphone

我有一个UINavigationController可见的导航栏.我有一个特别的UIViewController,我想在推入导航堆栈时隐藏状态栏.弹出这个viewController后,我想再次显示状态栏.

我在这个viewWillAppear方法中隐藏了这个栏UIViewController:

- (void) viewWillAppear:(BOOL)animated {

    [super viewWillAppear:animated];

    [self.navigationController setWantsFullScreenLayout:YES];
    [[UIApplication sharedApplication] setStatusBarHidden:YES animated:YES];    
}
Run Code Online (Sandbox Code Playgroud)

请注意,setWantsFullScreenLayout:YES为了清楚起见,我在此处设置,但实际上我只是在Interface Builder中设置此属性.

问题: NavigationController的导航栏不会向上移动以占用现在隐藏状态栏的空间.

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

[[UIApplication sharedApplication] setStatusBarHidden:YES animated:YES];
[self.navigationController setNavigationBarHidden:YES animated:NO];
[self.navigationController setNavigationBarHidden:NO animated:NO];
Run Code Online (Sandbox Code Playgroud)

但这显然是一个黑客,必须有一个更好的方法.

我试过的其他事情:

  1. 我试着[super viewWillAppear]在隐藏状态栏之后调用,即在我的方法结束时.

  2. 我在navigationController.view上尝试了setNeedsLayout,如下所示:

    [[UIApplication sharedApplication] setStatusBarHidden:YES animated:YES];    
    [self.navigationController.view setNeedsLayout];
    
    Run Code Online (Sandbox Code Playgroud)

但这似乎不起作用.

任何帮助赞赏.谢谢

Ron*_*Ron 10

有两种方法可以做你想要的.

一种是手动移动导航栏:

在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;
Run Code Online (Sandbox Code Playgroud)

在viewWillDisappear中:

    [UIApplication sharedApplication].statusBarHidden = NO;
    CGRect frame = self.navigationController.navigationBar.frame;
    frame.origin.y = 20.0;
    self.navigationController.navigationBar.frame = frame;
Run Code Online (Sandbox Code Playgroud)

如果您也愿意关闭导航栏,情况也会好转,虽然我怀疑这不是您想要的:

    [UIApplication sharedApplication].statusBarHidden = YES;
    self.navigationController.navigationBarHidden = YES;
Run Code Online (Sandbox Code Playgroud)