从 TabBarController 的子视图在 TabBar 后面插入子视图

Insert subview behind TabBar from child view of TabBarController

TabBar 有 2 个选项卡。在某些时候,我想从两个选项卡中的任何一个添加一个在两个选项卡视图上都可见但在 TabBar.

后面的视图

所以我想,在 TabBarController 中但在 TabBar 下方插入一个子视图。

这在原则上工作正常,我有 TabBar 背后的视图,但现在我想要覆盖我的 2 个选项卡。但是,它实际上并没有加载。只是它的后台加载,只有 viewDidLoad() 被调用, 不是 viewWillAppear() 或任何其他。

我也试过在 TabBarController 上调用 addChildViewController(myVC) 没有效果,并且还在我添加的视图控制器上手动调用 viewWillAppear() 也没有效果(我我也怀疑是否允许手动调用viewWillAppear()?)。

我想做的事情可行吗?我错过了什么?或者我应该尝试其他方式吗?

出于某种原因,当将子视图插入其 UITabBar 后面的 UITabBarController 时,尽管该视图对用户可见,但系统本身似乎认为它不是,所以尽管 viewDidLoad() 被调用,viewDidAppear() 和后续方法不被调用。

但是,在 UITabBar 上方添加子视图似乎工作正常。所以我通过将自己的新 UITabBar 作为子视图添加到 UITabBarController 来解决这个问题(基本上与默认设置完全相同)然后删除 UITabBarController's 默认 UITabBar.

然后当稍后将我的视图插入 UITabBarController 时,我像最初那样插入它,但是 below/behind 我的自定义 UITabBar 并且它似乎加载正常。

无需删除并重新创建 tabBar。您需要做的是在插入自定义视图后,您可以再次将 tabBar 置于最前面。

//bring the tabBar to the front after inserting new view
self.view.bringSubview(toFront: self.tabBar)

这是个好方法:

添加下面的函数并在您初始 VC 的 viewDidLoad 中调用它。它打开你的标签栏控制器实例(这是可选的),然后插入你总是希望在标签栏下方可见的视图。

private func setupAlwaysVisibleView() {
    guard let tabBarController = self.tabBarController else { return }

    tabBarController.view.insertSubview(alwaysVisibleView, belowSubview: tabBarController.tabBar)
}

您也可以在 UITabViewController 的 init() 方法中执行此操作:

 view.insertSubview(alwaysVisibleView, belowSubview: self.tabBar)

如果您使用的是 UITabViewController 的子类,则无需分派到另一个方法。

避免对 tabBarController 使用选项或删除当前的 tabBar。简单地将您的视图添加到 tabBar 视图下方。 Swift5,XCode11.

class TabBarController: UITabBarController {
    @IBOutlet var instructionsView: UIView!

    override func viewDidLayoutSubviews() {
        super.viewDidLayoutSubviews()

        self.view.insertSubview(instructionsView, belowSubview: self.tabBar)
    }
}