Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
导航栏与iOS 13 Swift中的状态栏重叠_Ios_Swift - Fatal编程技术网

导航栏与iOS 13 Swift中的状态栏重叠

导航栏与iOS 13 Swift中的状态栏重叠,ios,swift,Ios,Swift,在某些设备(如iPhone 7和8)中,导航栏在进行导航后与状态栏重叠,父视图控制器隐藏了状态栏,但我在ViewWillDisplay和hidden中分别显示和隐藏了状态栏,ViewWillEnglish和ViewWillEnglish。我在iOS 12上进行了测试,效果很好 我正在使用prefersStatusBarHidden隐藏状态栏 - (void)setStatusBarHidden:(BOOL)hidden { if (statusBarHidden != hidden

在某些设备(如iPhone 7和8)中,导航栏在进行导航后与状态栏重叠,父视图控制器隐藏了状态栏,但我在ViewWillDisplay和hidden中分别显示和隐藏了状态栏,ViewWillEnglish和ViewWillEnglish。我在iOS 12上进行了测试,效果很好

我正在使用prefersStatusBarHidden隐藏状态栏

 - (void)setStatusBarHidden:(BOOL)hidden
 {
     if (statusBarHidden != hidden)
     {
         statusBarHidden = hidden;
         [self setNeedsStatusBarAppearanceUpdate];
     }
 }
这里是图像

更新: 下面是一个示例项目:。 它在iOS 12中工作正常,但在iOS 13中,导航栏与iPhone 7,8中的状态栏重叠

iPhone 8(模拟器)的图像 第二种观点

好吧,我将给出一个含糊不清的答案

  • 一方面,你肯定在iOS 13中发现了一种新的行为。隐藏状态栏时,导航栏将收缩。你可以在iOS 13中将其称为bug

  • 另一方面,你所做的可能是错误的。如果你有导航栏,你已经无法在没有挡板的设备上隐藏状态栏(iPhone X等),现在苹果似乎认为如果你有导航栏,你根本不会隐藏状态栏。这是一个合理的假设,因为当存在导航栏时,在纵向中隐藏状态栏是没有意义的,尤其是在导航控制器的一些子项中,而在其他子项中则没有


所以你可以就此提交一份bug报告,但我认为你不会从中得到任何乐趣。苹果可能会回答说,这是有意的,或者至少是做了一些他们不想支持的事情的结果。你有一个导航栏;允许状态栏显示。

我面临同样的问题,经过几个小时的研究,我找到了一个不完美但有效的解决方案。希望它能为您工作。代码是用Objective-C编写的

在secondViewController的ViewDidDisplay方法中,首先隐藏状态栏并立即显示

 - (BOOL)prefersStatusBarHidden
 {
     return statusBarHidden;
 }
- (void)viewDidAppear:(BOOL)animated
{
    [super viewDidAppear:animated];

    [self setStatusBarHidden:YES];
    [self setStatusBarHidden:NO];
}
  • 在secondViewController中声明成员变量
    BOOL statusBarHidden
  •  - (BOOL)prefersStatusBarHidden
     {
         return statusBarHidden;
     }
    
     - (void)setStatusBarHidden:(BOOL)hidden
     {
         if (statusBarHidden != hidden)
         {
             statusBarHidden = hidden;
             [self setNeedsStatusBarAppearanceUpdate];
         }
     }
    
  • 从UIViewController实现prefersStatusBarHidden方法
     - (BOOL)prefersStatusBarHidden
     {
         return statusBarHidden;
     }
    
     - (void)setStatusBarHidden:(BOOL)hidden
     {
         if (statusBarHidden != hidden)
         {
             statusBarHidden = hidden;
             [self setNeedsStatusBarAppearanceUpdate];
         }
     }
    
  • 创建一个新方法setStatusBarHidden
     - (void)setStatusBarHidden:(BOOL)hidden
     {
         if (statusBarHidden != hidden)
         {
             statusBarHidden = hidden;
             [self setNeedsStatusBarAppearanceUpdate];
         }
     }
    
  • 调用setStatusBarHidden in ViewDidDisplay
     - (void)setStatusBarHidden:(BOOL)hidden
     {
         if (statusBarHidden != hidden)
         {
             statusBarHidden = hidden;
             [self setNeedsStatusBarAppearanceUpdate];
         }
     }
    
    - (void)viewDidAppear:(BOOL)animated
    {
        [super viewDidAppear:animated];
    
        [self setStatusBarHidden:YES];
        [self setStatusBarHidden:NO];
    }
    

  • 我注意到ios 13在改变方向等方面存在一些不好的布局问题。如果你将应用程序设置为背景并将其放回前台。附加布局是否解决了问题?“如果你将应用程序置于后台并将其放回前台”不起作用。我编辑了我的问题并添加了一个示例项目。好吧,你说得对,对不起,iOS 13中存在一个错误,隐藏状态栏会使导航栏变短。我认为我们对此无能为力。是的,你是对的。但我唯一想做的是在firstViewController中隐藏状态栏和导航栏,在secondViewController中显示状态栏和导航栏,我认为这没有错,因为我想在first view controller中获得全屏用户体验。我曾写信给苹果,但他们回答得很慢“我希望在第一视图控制器中获得全屏用户体验“啊,但是如果你想,你也可以隐藏导航栏。这就是我要说的。是的,我在firstViewController中也隐藏了导航栏,并在secondViewController中显示了它,但问题仍然存在。如果您在示例项目中没有看到这一点,我会用它更新您的更改,您可以测试它。
     - (BOOL)prefersStatusBarHidden
     {
         return statusBarHidden;
     }