子视图控制器调整容器视图大小

3

我的应用程序层次结构看起来像这样enter image description here

主视图控制器(我们称之为Controller 1)包含一个scrollView、一个image和一个containerView,该containerView指向另一个viewController并向tableView传递数据。

Controller 1滚动视图被设置为通过约束正确调整大小,以便containerView可以潜在地增加高度。

问题是tableView具有动态加载的数据,并且其大小会改变,但这不会反映在containerView上。我需要通知我的containerView有关tableView新大小的信息,以便它也可以相应地调整大小,用户可以在整个屏幕上滚动,而不仅仅是在containerView的默认大小内滚动。

希望这有意义。

我读到了一些关于preferredContentSizeDidChange的东西,但我不确定如何正确实现它或者它是否适用于我的情况。

实现中

 override func preferredContentSizeDidChangeForChildContentContainer(container: UIContentContainer) {
    super.preferredContentSizeDidChangeForChildContentContainer(container)
    print(container)
}

在控制器1中没有效果


你也可以在你的ContainerView中实现自己的代理方法(设置高度约束),并从你的childViewController(TableView)中调用它来更新高度。 - derdida
我不知道你是否可以测试这个,但是如果你在顶层没有一个滚动视图,是否仍然会有问题? - Phillip Mills
请告诉我是否我正确理解了您的问题。您是否希望容器随着表格视图数据的增加而增长(这将防止它滚动,因为表格视图的完整数据不会溢出),然后当它达到屏幕的总高度时,容器视图应停止增长,表格视图将溢出并开始滚动? - kerry
1个回答

7
这是一个老问题,但希望能对某些人有所帮助!我能够通过以下方法动态调整容器的大小以适应其内容:
在我的嵌入式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()
    }
}

2
“addChildViewController”是必须的才能触发“preferredContentSizeDidChange”吗? - Roi Mulia
你不需要强制转换childVC,因为container.preferredContentSize.height就是你要找的值。 - wider-spider

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接