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

时间:2015-09-02 22:16:59

标签: ios swift uitabbarcontroller subview

我有TabBar个标签。在某些时候,从两个标签中的任何一个,我想添加一个在两个标签视图上都可见但在TabBar后面的视图。

所以我想,将子视图插入TabBarController但在TabBar下面。

这在原则上工作得很好,我有TabBar背后的视图,但现在覆盖了我想要的2个标签。但是,它实际上并没有加载。只是后台加载,只调用viewDidLoad() viewWillAppear()或其他任何内容。

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

我正在尝试做什么?我错过了什么?或者我应该以其他方式尝试这个吗?

5 个答案:

答案 0 :(得分:2)

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

但是,在viewDidAppear()上方添加子视图似乎工作正常。所以我通过将自己的新UITabBar作为子视图添加到UITabBar(基本上与默认设置完全相同),然后删除UITabBarController默认{{1} }。

然后,当我稍后将我的视图插入UITabBarController's时,我会按照原来的方式插入它,而不是在我的自定义UITabBar之下/之后插入它,它似乎可以正常加载。

答案 1 :(得分:1)

这将是一个好方法:

添加以下功能,并在初始VC的viewDidLoad中调用它。它会展开您的标签栏控制器实例(这是可选的),然后在标签栏下方插入您始终想要显示的视图。

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

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

答案 2 :(得分:0)

无需删除并重新创建tabBar。您需要做的是在插入自定义视图后,然后再将tabBar带到前面。

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

答案 3 :(得分:0)

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

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

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

答案 4 :(得分:0)

避免为tabBarController使用可选参数或删除当前的tabBar。只需在tabBar视图下添加您的视图。 Swift 5,XCode 11。

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

    override func viewDidLayoutSubviews() {
        super.viewDidLayoutSubviews()

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