如何使导航栏符合安全区域?

时间:2018-10-09 17:15:11

标签: swift

我从没有导航栏的屏幕移动到有导航栏的屏幕。 转到导航栏屏幕时,该栏未包含在任何安全区域限制中,并且与iPhone X上的状态栏重叠。我在寻找解决方案,但对我没有任何帮助。 如何使导航栏与iPhone X上的安全区域指南一致,使其不会重叠? 另外,它的高度似乎太短了,但我想可以通过约束来解决。

谢谢!

AppDelegate:

var window: UIWindow?
var navigationController: UINavigationController?
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
    // Override point for customization after application launch.
    window = UIWindow(frame: UIScreen.main.bounds)

    if let window = window{
        let mainVC = ViewController()
        navigationController = UINavigationController(rootViewController: mainVC)
        window.rootViewController = navigationController
        window.makeKeyAndVisible()
    }
    return true
}

这是我用来从ViewController移到AboutViewController的方法:

    @objc private func infoButtonTap(){
    let aboutVC = AboutViewController()
    self.navigationController?.pushViewController(aboutVC, animated: true)
}

编辑: 它是这样的: https://imgur.com/syuQaUn

AboutVC:

此行在viewDidLoad中:

        navigationController?.isNavigationBarHidden = false

使导航栏可见。

4 个答案:

答案 0 :(得分:3)

如果您确实要使导航控制器位于安全区域内。这是为您提供的一种解决方案。

  1. 创建了一个UIController作为所有内容的基本控制器。我们称之为SuperParentController

  2. 确保SuperParentController也是导航控制器的父级。

  3. 然后,您可以操作SuperParentController的内容和布局,以确保导航控制器位于所需的位置。

我们有点使用这种策略来为我们的应用程序显示可以随时显示的通用横幅。

答案 1 :(得分:0)

您的样本中的所有内容看起来都是正确的。我猜想ViewControllerAboutViewController中发生的帧有一些操纵。看一下window.rootViewController何时将其更改为framebounds以调试正在发生的事情。

答案 2 :(得分:0)

我不确定问题出在哪里。您的屏幕截图是指横向模式。从iOS8开始,此行为是针对横向的。当您通过相应的UINavigationController包含了导航栏,并按下了下一个ViewController时,就可以直接使用它了。

UINavigationBar为44ps,但StatusBarFrames不同-您可以使用UIApplication.shared.statusBarFrame.height获取状态栏的实际高度并将其添加到导航栏高度。

顺便说一句:如果您想遵守iPhone X,Xs和Xr的sareAreaLayouts,可以使用合适的NSLayout-Y/X-AxisAnchor来满足您的需求。

答案 3 :(得分:-1)

将视图控制器嵌入导航控制器中,而不是手动添加导航栏。在情节提要中选择视图控制器,然后按照所附屏幕截图中的说明进行操作。

Editor -> Embed In -> Navigation Controller