导航栏在iOS 13 Swift中重叠状态栏。

4
在某些设备上,如iPhone 7和8,在导航后,导航栏会重叠状态栏。父视图控制器隐藏状态栏,但我分别在viewWillAppear和viewWillDisappear中显示和隐藏它。我在iOS 12上进行了测试,它可以正常工作。
我使用prefersStatusBarHidden来隐藏状态栏。
这里是图片 Navbar Overlaps Status bar 更新: 这里有一个示例项目:https://github.com/FranklinSamboni/NavBarTestSwfit。 在iOS 12中它可以正常工作,但在iOS 13中,导航栏会在iPhone 7、8上重叠状态栏。
iPhone 8的图片(模拟器) Home 第二个视图 Second View

我注意到在iOS 13上,当改变方向等操作时会出现一些糟糕的布局问题。如果将应用程序放入后台并将其带回前台,是否会修复此问题?额外的布局传递是否解决了这个问题? - Amerino
如果您将应用程序放入后台并将其带回前台,这种方法不起作用。 - Franklin Samboni Castillo
1
我编辑了我的问题并添加了一个示例项目。 - Franklin Samboni Castillo
1
好的,你是对的,抱歉,在iOS 13中隐藏状态栏会使导航栏变短。我认为我们无法解决这个问题。 - matt
2个回答

1

好的,我将给出一个模棱两可的回答。

  • 一方面,在iOS 13中你肯定发现了一种新的行为。当你隐藏状态栏时,导航栏会缩小。你可以称这是iOS 13的一个错误...

  • 另一方面,可以认为您所做的是错误的。如果您有一个导航栏,您已经无法在没有边框的设备上隐藏状态栏(如iPhone X等),现在苹果似乎认为如果您有一个导航栏,您不会完全隐藏状态栏。这是一个合理的假设,因为在竖屏时隐藏状态栏没有任何意义,特别是在导航控制器的某些子控制器中而不是其他控制器中。

所以你可以报告这个bug,但我不认为你会从中得到任何帮助。苹果可能会回复这是故意的,或者至少是他们不想支持的事情的后果。你有一个导航栏,让状态栏显示。


1
是的,你说得对。但我想做的唯一一件事就是在第一个视图控制器中隐藏状态栏和导航栏,在第二个视图控制器中显示状态栏和导航栏。我认为这并没有错,因为我想要在第一个视图控制器中获得全屏用户体验。 - Franklin Samboni Castillo
我向苹果公司反映了这个问题,但他们的回复很慢。 - Franklin Samboni Castillo
我希望在第一个视图控制器中获得全屏用户体验。但是,如果您想要这样做,您也需要隐藏导航栏。这就是我所说的重点。 - matt
是的,我也在第一个视图控制器中隐藏了导航栏,在第二个视图控制器中显示它,但问题仍然存在。 - Franklin Samboni Castillo
如果您在示例项目中没有看到这个,我已经使用它更新了您的更改,您可以进行测试。 - Franklin Samboni Castillo

1
我遇到了相同的问题,经过几个小时的研究,我找到了一个不完美但可行的解决方案。希望它对你有用。这段代码是用Objective-C编写的。
在secondViewController的viewDidAppear方法中,先隐藏状态栏,然后立即显示它。
  1. Declare a member variable BOOL statusBarHidden in secondViewController
  2. Implement prefersStatusBarHidden method from UIViewController
     - (BOOL)prefersStatusBarHidden
     {
         return statusBarHidden;
     }
    
  3. Create a new method setStatusBarHidden
     - (void)setStatusBarHidden:(BOOL)hidden
     {
         if (statusBarHidden != hidden)
         {
             statusBarHidden = hidden;
             [self setNeedsStatusBarAppearanceUpdate];
         }
     }
    
  4. Call setStatusBarHidden in viewDidAppear
    - (void)viewDidAppear:(BOOL)animated
    {
        [super viewDidAppear:animated];
    
        [self setStatusBarHidden:YES];
        [self setStatusBarHidden:NO];
    }
    

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接