我正在开发一个 iOS 应用程序,我需要在整个屏幕上呈现一个视图控制器,包括 UITabBarController,而不将视图控制器添加到选项卡栏的项目或更改选项卡栏的功能。我的目标是覆盖此视图控制器而不使其成为可选择的选项卡之一,从而保持用户界面的完整性。
挑战如下:当我使用 addChild 和 addSubview 方法将视图控制器添加到选项卡栏控制器时,它会破坏现有的选项卡栏项目。或者,当以模态方式呈现时,我实现了我想要的叠加效果,但与其他模态相关的行为作斗争。
这是我尝试过的两种方法: 小时候添加:
func presentAdditionalViewController(
from presentingController: UIViewController,
to tabBarController: UITabBarController
) {
let additionalViewController = UIViewController()
DispatchQueue.main.async {
presentingController.dismiss(animated: false) {
tabBarController.addChild(additionalViewController)
tabBarController.view.addSubview(additionalViewController.view)
additionalViewController.didMove(toParent: tabBarController)
additionalViewController.view.frame = tabBarController.view.frame
tabBarController.view.bringSubviewToFront(additionalViewController.view)
}
}
}
此方法会导致出现“幽灵”选项卡栏项目,这是不可取的。
所以我尝试使用替代方法 2.模态呈现:
func presentAdditionalViewController(from presentingController: UIViewController, in tabBarController: UITabBarController) {
let additionalViewController = UIViewController() // Placeholder for the actual view controller
// Setup modal presentation styles
additionalViewController.modalPresentationStyle = .overFullScreen
additionalViewController.modalTransitionStyle = .crossDissolve
DispatchQueue.main.async {
presentingController.dismiss(animated: false) {
tabBarController.present(additionalViewController, animated: true, completion: nil)
}
}
}
所以这个方法是有效的,从某种意义上说它没有添加另一个选项卡。但问题是,我希望这个“附加子视图控制器”漂浮在选项卡栏上方,这意味着用户应该能够与选项卡栏交互,切换选项卡,玩弄“附加子视图控制器”背后的视图。
但是第二种方法以某种方式留下了阻止任何类型交互的“UITransitionView”。
在 iOS18 更新后,我开始注意到这个“幽灵”选项卡栏项目,我正在努力解决这个问题,希望得到一些建议。
创建一个包含选项卡栏的containerView来规避这个问题
func presentAdditionalViewController(
from presentingController: UIViewController,
to homeContainerViewController: UIViewController
) {
let additionalViewController = UIViewController()
DispatchQueue.main.async {
presentingController.dismiss(animated: false) {
homeContainerViewController.addChild(additionalViewController)
homeContainerViewController.view.addSubview(additionalViewController.view)
additionalViewController.didMove(toParent: homeContainerViewController)
additionalViewController.view.frame = homeContainerViewController.view.frame
homeContainerViewController.view.bringSubviewToFront(additionalViewController.view)
}
}
}