【问题标题】:How to make Navigation Bar to conform to safe area?如何使导航栏符合安全区域?
【发布时间】:2018-10-09 17:15:10
【问题描述】:

我从没有导航栏的屏幕移动到有导航栏的屏幕。 转到导航栏屏幕时,该栏不包含在任何安全区域约束中,并且与 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

关于VC:

这一行在 viewDidLoad 中:

        navigationController?.isNavigationBarHidden = false

使导航栏可见。

【问题讨论】:

  • 如果您的问题已解决,请忽略此评论。您能否确认您仅使用与 navigationController 关联的 navigationBar 来进行显示?或者,您的 AboutViewController 类或界面构建器中是否使用了任何其他自定义导航栏?因为,否则一切看起来都很好,不应该引起这个问题。

标签: swift


【解决方案1】:

如果您真的想让您的导航控制器位于安全区域内。这是适合您的一种解决方案。

  1. 创建了一个 UIController 作为一切的基础控制器。我们就叫它SuperParentController吧。

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

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

我们有点使用这种策略来为我们的应用展示一个可以随时展示的通用横幅。

【讨论】:

  • 非常感谢
  • 你是当天的英雄 :)
【解决方案2】:

您的示例中的所有内容看起来都是正确的。我猜在ViewControllerAboutViewController 中发生了一些对帧的操作。查看window.rootViewController 何时更改framebounds 以调试正在发生的事情。

【讨论】:

  • 导航栏隐藏在ViewController中,我想在AboutViewController中用后退按钮显示,所以我猜它在AboutViewController中发生了变化。如何更改它以符合安全区域指南?
  • @JohnDoah 如果您不想拥有导航控制器的外观,那么为什么不使用模态视图控制器来呈现 About 而不是导航控制器呢?
  • @JohnDoah 你能贴出隐藏和显示导航栏和/或状态栏的代码吗?
  • 我张贴这条线以使栏可见。
【解决方案3】:

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

Editor -> Embed In -> Navigation Controller

【讨论】:

  • 谢谢,我忘了说我没有使用故事板。应该提到,对不起,我现在正在编辑 OP。
  • 哦,对了。不用担心。抱歉,如果没有故事板,我不知道该怎么做。
【解决方案4】:

我不确定问题是什么。您的屏幕截图是指横向模式。自 iOS8 以来,此行为旨在用于横向。当您通过相应的 UINavigationController 包含导航栏并推送下一个 ViewController 时,您就可以继续使用了。

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

顺便说一句:如果您想尊重 iPhone X、Xs 和 Xr 的 sareAreaLayouts,有一个合适的NSLayout-Y/X-AxisAnchor 可以满足您的需求。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-08-03
    • 2022-10-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多