子 ViewController 调整 containerView 的大小
Posted
技术标签:
【中文标题】子 ViewController 调整 containerView 的大小【英文标题】:Child ViewController to resize containerView 【发布时间】:2016-08-20 11:43:47 【问题描述】:我的应用层次结构类似于
主视图控制器(我们称之为控制器 1)包含一个滚动视图、一个图像和一个容器视图,该容器视图指向另一个视图控制器并将数据传递给一个 tableView。
Controller 1 滚动视图设置为使用约束正确调整大小,以便 containerView 可以潜在地增加高度。
问题是 tableView 具有动态加载的数据并且其大小发生变化,但这不会反映在 containerView 上。我需要通知我的 containerView 有关 tableView 的新大小,以便它也可以相应地调整大小,并且用户可以滚动整个屏幕,而不仅仅是在 containerView 的默认大小内。
我希望这是有道理的。
我读到了一个名为 preferredContentSizeDidChange 的东西,但我不确定如何正确实施它,或者它是否适用于我的情况。
实施
override func preferredContentSizeDidChangeForChildContentContainer(container: UIContentContainer)
super.preferredContentSizeDidChangeForChildContentContainer(container)
print(container)
在控制器 1 中无效
【问题讨论】:
您也可以在您的 ContainerView 中实现您自己的委托方法(设置高度约束) - 并从您的 childViewController (TableView) 调用它来更新高度。 不知道能不能测试一下,但是如果顶层没有滚动视图,还会有问题吗? 如果我理解你的问题,请告诉我。您是否希望容器随着tableview数据的增加而增长(这将阻止它滚动,因为tableview的完整数据不会溢出)然后当它达到屏幕的总高度时,容器视图应该停止增长并且tableview会溢出并开始滚动? 【参考方案1】:这是一个老问题,但希望它会帮助别人!通过执行以下操作,我能够动态调整容器的大小以适应其内容:
在我嵌入的 UITableViewController 中,我添加了:
preferredContentSize.height = tableView.contentSize.height
为了更改容器的大小,我将嵌入式视图控制器添加为父视图控制器的子视图:
override func prepare(for segue: UIStoryboardSegue, sender: Any?)
if let destination = segue.destination as? MyTableViewController
addChildViewController(destination)
最后,我为容器和它的高度约束添加了一个出口,并在父视图控制器中添加了以下内容:
override func preferredContentSizeDidChange(forChildContentContainer container: UIContentContainer)
super.preferredContentSizeDidChange(forChildContentContainer: container)
if let child = container as? MyTableViewController
containerHeightConstraint.constant = child.preferredContentSize.height
container.updateConstraints()
【讨论】:
是否必须“addChildViewController”才能触发“preferredContentSizeDidChange”? 您不需要强制转换 childVC,因为 container.preferredContentSize.height 是您要查找的值。以上是关于子 ViewController 调整 containerView 的大小的主要内容,如果未能解决你的问题,请参考以下文章