子视图控制器来调整containerView
问题描述:
我的应用程序的层次结构看起来像这样子视图控制器来调整containerView
主视图控制器(让我们称之为控制器1)包含一个滚动视图,图像以及指向其它的viewController和将数据传送给的tableView一个containerView 。
控制器1的滚动视图被设置为使用约束正确调整大小,以便containerView可以在高度上增长。
问题是tableView有动态加载的数据,它的大小发生了变化,但是这并不反映在containerView上。我需要我的containerView通知有关tableView的新大小,以便它可以相应调整大小,用户可以滚动浏览整个屏幕,而不仅仅是默认大小的containerView。
我希望这是有道理的。
我读了一些名为preferredContentSizeDidChange的东西,但我不确定如何正确实施它,或者它是否适用于我的情况。
实施
override func preferredContentSizeDidChangeForChildContentContainer(container: UIContentContainer) {
super.preferredContentSizeDidChangeForChildContentContainer(container)
print(container)
}
在控制器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()
}
}
你也可以在你的ContainerView中实现你自己的委托方法(设置高度约束) - 并从你的childViewController(TableView)调用它来更新高度。 – derdida
我不知道你是否可以测试这个,但是,如果你没有顶层的滚动视图,会不会有问题? –
请告诉我,如果我正确理解你的问题。你希望容器随着表视图数据的增加而增长(这将阻止它滚动,因为tableview的完整数据不会溢出),然后当它达到屏幕的总高度时,容器视图应该停止增长并且tableview会溢出并开始滚动? – kerry