【问题标题】:Adding UINavigationController as child of other UINavigationController将 UINavigationController 添加为其他 UINavigationController 的子级
【发布时间】:2021-05-01 01:47:11
【问题描述】:

我正在尝试添加一个 UINavigationController 作为另一个 UINavigationController 的子级。我面临的问题是子 UINavigationController 的导航栏不尊重顶部的安全区域 - 高度太小并且导航栏被缺口覆盖。

在下面的截图中,黄色导航栏和视图是子 UINavigationController 的一部分,而蓝色视图和白色导航栏是根 UINavigationController 的一部分。子 UINavigationController 应该只覆盖屏幕的一部分。如果一切正常,黄色导航栏的大小应该与白色导航栏的大小相同。

有人可能认为将子视图控制器添加到 UINavigationController 不是一个好主意,但我正在开发一个可用于显示“侧边栏”导航或抽屉的组件,并且它可以作为子视图添加到任何类型的任何视图控制器。

这里有一些代码可以重现我遇到的问题:

override func viewDidAppear(_ animated: Bool) {
    super.viewDidAppear(animated)
    
    self.view.backgroundColor = .blue
    self.title = "Parent"
    
    let childVC = UIViewController()
    childVC.view.backgroundColor = .yellow
    childVC.title = "Modal"
    
    let childNavController = UINavigationController(rootViewController: childVC)
    childNavController.view.translatesAutoresizingMaskIntoConstraints = false
    
    let rootNavController = self.navigationController!
    
    rootNavController.addChild(childNavController)
    rootNavController.view.addSubview(childNavController.view)
    
    NSLayoutConstraint.activate([
        childNavController.view.widthAnchor.constraint(equalToConstant: 300),
        childNavController.view.topAnchor.constraint(equalTo: rootNavController.view.topAnchor),
        childNavController.view.bottomAnchor.constraint(equalTo: rootNavController.view.bottomAnchor),
        childNavController.view.rightAnchor.constraint(equalTo: rootNavController.view.rightAnchor)
    ])
    childNavController.didMove(toParent: rootNavController)
}

【问题讨论】:

    标签: ios swift uinavigationcontroller childviewcontroller


    【解决方案1】:

    正确的方法是为两个 UINavigationControllers 创建一个共同的父级 - 只需清空 UIViewController,然后使用包含将这两个作为子视图控制器嵌入。

    UINavigationController 有一个内置的子视图管理,当您使用它时(显示/隐藏视图控制器),像这样嵌入子视图和子视图控制器是有风险的。

    【讨论】:

    • 谢谢,这似乎有效。我会更喜欢不需要添加额外视图控制器的解决方案,但这样就可以了。
    • @andlin 使用通用容器并没有什么坏处——这将是一个非常稳定和可取的解决方案,将来不会给您带来任何问题。此外,如果您需要更多(例如,由第三个视图控制器处理的侧边栏中的自定义弹出窗口),这种方式可以让您轻松添加 2 个以上的 ViewController。使用presentViewController 这样做总是很痛苦。
    猜你喜欢
    • 1970-01-01
    • 2015-09-04
    • 2015-08-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-15
    • 1970-01-01
    相关资源
    最近更新 更多