子 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 的大小的主要内容,如果未能解决你的问题,请参考以下文章

自定义 Viewcontroller 转换无法正确调整大小

子视图未使用 addSubview 调整大小

如何调整视图大小以使其子视图也调整大小

使用自动布局调整子视图的大小

使用故事板时需要以编程方式调整子视图的大小?

调整视图大小时,ViewController 放错了位置