隐藏状态栏和导航栏位置

Posted

技术标签:

【中文标题】隐藏状态栏和导航栏位置【英文标题】:Hiding status bar and navigation bar position 【发布时间】:2014-05-26 18:30:26 【问题描述】:

我有一个无法处理的问题。我有两个视图控制器,我使用[[UIApplication sharedApplication] setStatusBarHidden:isHidden withAnimation:UIStatusBarAnimationSlide]; 来显示/隐藏状态栏。一切正常,但我需要一件事:一切都嵌入导航控制器中,隐藏状态栏后导航栏向上移动 20 像素。我怎样才能消除这种影响?无论有没有状态栏,我都希望导航栏每次都在同一个地方。

Edit1:我已经这样做了

-(void)viewWillAppear:(BOOL)animated

    [super viewWillAppear:animated];
    self.navigationController.navigationBar.layer.transform = CATransform3DIdentity;
    [[UIApplication sharedApplication] setStatusBarHidden:NO withAnimation:UIStatusBarAnimationSlide];


-(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender

    self.navigationController.navigationBar.layer.transform = CATransform3DMakeTranslation(0, 20, 0);

它可以工作,但动画很糟糕,我需要更好的东西。

【问题讨论】:

如果我没记错的话,我认为这是一个已知的错误。信息:blog.motioninmotion.tv/… 当您过渡到新的视图控制器时,您是否希望看到状态栏向上滑动,而导航栏保持在原位(而不是在新控制器中永远看不到状态栏)? 【参考方案1】:

没有干净的方法可以防止 UINavigationController 调整其导航栏的高度。我在this SO answer 中详细描述了该行为。

目前唯一的解决方法是 UINavigationController 仅在其视图的边界与窗口的边界匹配时执行这些高度调整,即,如果导航控制器的视图填满屏幕。如果视图的边界是关闭的,即使是一个像素,它也会默认为标准的 44 点高的导航栏。

Karah 上面的回答是不正确的。 UIViewControllerBasedStatusBarAppearance 用于确定状态栏的颜色和可见性。它与 UINavigationController 的导航栏高度逻辑无关。

【讨论】:

【参考方案2】:

没有明确的方法可以做到这一点,但你可以通过在 ViewDidLoad 中使用以下代码来设置这个东西:

    CGRect statusFrame = CGRectMake(0.0, -20.0, 1024, 20);
    UIView* statusBar = [[UIView alloc] initWithFrame:statusFrame];
    statusBar.backgroundColor = [UIColor blackColor];
    [self.view addSubview:statusBar];
    [statusBar release];

【讨论】:

【参考方案3】:

当你的状态栏被隐藏时,导航栏会自动向上移动以弥补空间。

如果您将UIViewControllerBasedStatusBarAppearance 设置为YES,它应该会停止这种行为。

【讨论】:

但是人想隐藏状态栏,保持导航栏位置。仅仅禁用不受单个视图控制器控制的选项没有帮助。

以上是关于隐藏状态栏和导航栏位置的主要内容,如果未能解决你的问题,请参考以下文章

点击设备时如何隐藏状态栏和导航栏

iOS 7,状态栏和导航栏:像 Reeder 一样使用侧面板隐藏或滑动

在 iPhone X 上,分别控制显示/隐藏导航栏和状态栏

Android 8.0 隐藏状态栏和导航栏

Android基础篇 显示隐藏状态栏和导航栏

Android 弹出Dialog时隐藏状态栏和底部导航栏