将 UINavigationController 添加为其他 UINavigationController 的 child
Adding UINavigationController as child of other UINavigationController
我正在尝试添加一个 UINavigationController 作为另一个 UINavigationController 的 child。我面临的问题是 child UINavigationController 的导航栏不遵守顶部的安全区域 - 高度太小,导航栏被缺口覆盖。
在下面的屏幕截图中,黄色导航栏和视图是 child UINavigationController 的一部分,而蓝色视图和白色导航栏是根 UINavigationController 的一部分。 child UINavigationController 应该只覆盖部分屏幕。如果一切正常,黄色导航栏的大小应与白色导航栏相同。
有人可能认为将 child 视图控制器添加到 UINavigationController 不是一个好主意,但我正在开发一个可用于显示“侧边栏”导航或抽屉的组件,它可以可能作为 child 添加到任何类型的任何视图控制器。
下面是一些重现我遇到的问题的代码:
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)
}
正确的方法是为两个 UINavigationController 创建一个共同的父级 - 只是清空 UIViewController,然后使用包含将它们作为子视图控制器嵌入。
UINavigationController
有一个内置的子视图管理,当您使用它时(show/hide viewcontrollers),像这样嵌入子视图和子视图控制器是有风险的。
我正在尝试添加一个 UINavigationController 作为另一个 UINavigationController 的 child。我面临的问题是 child UINavigationController 的导航栏不遵守顶部的安全区域 - 高度太小,导航栏被缺口覆盖。
在下面的屏幕截图中,黄色导航栏和视图是 child UINavigationController 的一部分,而蓝色视图和白色导航栏是根 UINavigationController 的一部分。 child UINavigationController 应该只覆盖部分屏幕。如果一切正常,黄色导航栏的大小应与白色导航栏相同。
有人可能认为将 child 视图控制器添加到 UINavigationController 不是一个好主意,但我正在开发一个可用于显示“侧边栏”导航或抽屉的组件,它可以可能作为 child 添加到任何类型的任何视图控制器。
下面是一些重现我遇到的问题的代码:
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)
}
正确的方法是为两个 UINavigationController 创建一个共同的父级 - 只是清空 UIViewController,然后使用包含将它们作为子视图控制器嵌入。
UINavigationController
有一个内置的子视图管理,当您使用它时(show/hide viewcontrollers),像这样嵌入子视图和子视图控制器是有风险的。