如何防止 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的索引