简体   繁体   English

NavBar 与 iOS 13 Swift 中的状态栏重叠

[英]NavBar overlaps Status Bar in iOS 13 Swift

In some devices as iPhone 7 and 8 the navigation bar overlaps status bar after do navigating, the parent view controller has status bar hidden but I show and hide it in viewWillAppear and viewWillDisappear respectively.在某些设备(如 iPhone 7 和 8)中,导航栏在导航后与状态栏重叠,父视图 controller 隐藏了状态栏,但我分别在 viewWillAppear 和 viewWillDisappear 中显示和隐藏它。 I tested in iOS 12 and it works.我在 iOS 12 中进行了测试,它可以工作。

I am using prefersStatusBarHidden to hidden the status bar.我正在使用 prefersStatusBarHidden 来隐藏状态栏。

Here the Image Navbar Overlaps Status bar此处图像导航栏与状态栏重叠

Update: Here an example project: https://github.com/FranklinSamboni/NavBarTestSwfit .更新:这里是一个示例项目: https://github.com/FranklinSamboni/NavBarTestSwfit It work fine in iOS 12 but with iOS 13 the navigation bar overlaps status bar in iPhone 7,8它在 iOS 12 中运行良好,但在 iOS 13 中,导航栏与 iPhone 7,8 中的状态栏重叠

Images with iPhone 8 (simulator) Home The second view Second View使用 iPhone 8(模拟器)的图像首页第二个视图第二个视图

Okay, I'm going to give one of those wishy-washy answers.好的,我将给出其中一个空洞的答案。

  • On the one hand, you've definitely found a new behavior in iOS 13. When you hide the status bar, the navigation bar shrinks.一方面,您肯定在 iOS 13 中发现了一个新行为。当您隐藏状态栏时,导航栏会缩小。 You could term this a bug in iOS 13...您可以将此称为 iOS 13 中的错误...

  • On the other hand, it could be argued that what you are doing is wrong.另一方面,可能会争辩说您所做的事情是错误的。 If you have a navigation bar, you already cannot hide the status bar on a device without a bezel (iPhone X etc.), and now Apple seems to be assuming that if you have a navigation bar you won't hide the status bar at all .如果您有导航栏,您已经无法在没有边框的设备(iPhone X 等)上隐藏状态栏,现在 Apple 似乎假设如果您有导航栏,您将不会隐藏状态栏所有. And that is a reasonable assumption, because it makes no sense to hide the status bar in portrait when there is a navigation bar, and especially in some children of the navigation controller but not others.这是一个合理的假设,因为当有导航栏时,纵向隐藏状态栏是没有意义的,尤其是在导航 controller 的某些子项中,而在其他子项中则不然。

So you could file a bug report on this, but I don't think you'll get any joy from it.因此,您可以就此提交错误报告,但我认为您不会从中获得任何乐趣。 Apple is likely to reply that this is intended, or is at least a consequence of doing something they don't want to support.苹果可能会回答说这是有意的,或者至少是他们不想支持的事情的结果。 You have a navigation bar;你有一个导航栏; allow the status bar to show.允许显示状态栏。

I faced the same problem, after a few hours research, I found a not perfect but worked solution.我遇到了同样的问题,经过几个小时的研究,我发现了一个不完美但有效的解决方案。 Hope it will work for you.The code was written with Objective-C.希望它对你有用。代码是用 Objective-C 编写的。

In viewDidAppear method of the secondViewController, hide statusBar first and show it at once.在 secondViewController 的 viewDidAppear 方法中,先隐藏 statusBar,然后立即显示。

  1. Declare a member variable BOOL statusBarHidden in secondViewController在 secondViewController 中声明一个成员变量BOOL statusBarHidden
  2. Implement prefersStatusBarHidden method from UIViewController从 UIViewController 实施 prefersStatusBarHidden 方法
     - (BOOL)prefersStatusBarHidden { return statusBarHidden; }
  3. Create a new method setStatusBarHidden创建一个新方法 setStatusBarHidden
     - (void)setStatusBarHidden:(BOOL)hidden { if (statusBarHidden;= hidden) { statusBarHidden = hidden; [self setNeedsStatusBarAppearanceUpdate]; } }
  4. Call setStatusBarHidden in viewDidAppear在 viewDidAppear 中调用 setStatusBarHidden
     - (void)viewDidAppear:(BOOL)animated { [super viewDidAppear:animated]; [self setStatusBarHidden:YES]; [self setStatusBarHidden:NO]; }

You were always doing this wrong.你总是做错了。 Use two view controller classes.使用两个视图 controller 类。 Get rid of your navigation controller override.摆脱您的导航 controller 覆盖。 This is all it takes:这就是它所需要的:

class ViewController: UIViewController {

    override var preferredStatusBarUpdateAnimation: UIStatusBarAnimation{
        return .fade
    }

    override var prefersStatusBarHidden: Bool { return true }
}

class ViewController2: UIViewController {

    override var preferredStatusBarUpdateAnimation: UIStatusBarAnimation{
        return .fade
    }

    override var prefersStatusBarHidden: Bool { return false }

}

Or whatever your preference is.或者无论你的喜好是什么。 In other words, just let each view controller dictate its own status bar preference, and the navigation controller obeys automatically.换句话说,只要让每个视图 controller 决定自己的状态栏偏好,导航 controller 就会自动服从。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM