如何防止 UITabBarController 更新子视图?

Posted

技术标签:

【中文标题】如何防止 UITabBarController 更新子视图?【英文标题】:How do I prevent UITabBarController from updating subviews? 【发布时间】:2019-03-05 23:04:29 【问题描述】:

在 ContainerView 内部,我有一个 UITabBarController 子类,我在其中修改了 UITabBar Y 位置。我没有将它放在底部,而是使用以下代码将其移近顶部:

override func viewDidLayoutSubviews() 
    tabBar.frame = CGRect(x: 0, y: 0, width: tabBar.frame.size.width, height: tabBar.frame.size.height)
    super.viewDidLayoutSubviews()
    delegate = self
    selectedViewController?.view.frame.origin = CGPoint(x: 0, y: tabBar.frame.size.height)


func tabBarController(_ tabBarController: UITabBarController, didSelect viewController: UIViewController) 
    selectedViewController?.view.frame.origin = CGPoint(x: 0, y: tabBar.frame.size.height)

它最初工作得很好:第一个标签视图包含一个 UITableView,它似乎为 UITabBar 的新位置调整了它的框架。但是,如果我在堆栈上推送一个 ViewController,在推送动画的中途,包含 UITableView 的视图底部会像 UITabBar 一样跳起来。因此,视图顶部的一部分最终位于 UITabBar 后面,并且在将这个新的 ViewController 从堆栈中弹出后,返回到 UITabBarController,视图(带有 tableView)保持在 tabBar 的新位置后面的这个位置。我尝试在 ViewWillAppear、ViewWillDisappear、ViewDidDisappear 中更改视图原点,但这些方法都无法将视图(包含 tableView)的位置重置到 UITabBar 的新位置下方。

我不确定是什么导致了这种情况发生,或者要调查什么生命周期方法。

有什么想法或建议吗?

编辑:TableView 是真正改变它的原点,而不是视图。

【问题讨论】:

@Sh_Khan 不幸的是,我也尝试过,但结果相同。然而我注意到的是,当我在容器视图上设置“自动调整子视图”时,它会导致不同的结果..但 t 似乎仍然不正确 【参考方案1】:

似乎您可能需要将 super.viewDidLayoutSubviews() 调用放在覆盖的顶部。你试过吗?我认为超类方法实际上也会调整位置,因此您的更改可能会被覆盖。

【讨论】:

不幸的是,我试过了,但也没有用。【参考方案2】:

我通过在 ViewWillAppear 和 ViewWillDisappear 中执行这段代码解决了这个布局问题。我无法解释为什么会这样,但我知道确实如此。

tabBar.invalidateIntrinsicContentSize()
tabBar.superview?.setNeedsLayout()
tabBar.superview?.layoutSubviews()

【讨论】:

以上是关于如何防止 UITabBarController 更新子视图?的主要内容,如果未能解决你的问题,请参考以下文章

如何防止通过推送 SFSafariViewController 解雇 UITabBarController?

防止自定义 UITabBarController 更改选项卡

如何在UITabBarController中获取特定UIViewController的索引

使选定的 UITabBarController 项目图标更大

UITabBarController 视图之间的共享控件

在 UITabbarController 中设置视图控制器的委托