如何在 iOS 中将子 ViewController 添加到 UITabBarController 而不创建“幽灵”选项卡栏项目?

问题描述 投票:0回答:1

我正在开发一个 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 更新后,我开始注意到这个“幽灵”选项卡栏项目,我正在努力解决这个问题,希望得到一些建议。

ios swift uikit uitabbarcontroller uitabbaritem
1个回答
0
投票

创建一个包含选项卡栏的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)
        }
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.