2016-08-20 133 views
1

我的应用程序的层次结构看起来像这样enter image description here子视图控制器来调整containerView

主视图控制器(让我们称之为控制器1)包含一个滚动视图,图像以及指向其它的viewController和将数据传送给的tableView一个containerView 。

控制器1的滚动视图被设置为使用约束正确调整大小,以便containerView可以在高度上增长。

问题是tableView有动态加载的数据,它的大小发生了变化,但是这并不反映在containerView上。我需要我的containerView通知有关tableView的新大小,以便它可以相应调整大小,用户可以滚动浏览整个屏幕,而不仅仅是默认大小的containerView。

我希望这是有道理的。

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

实施

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

在控制器1并没有影响

+0

你也可以在你的ContainerView中实现你自己的委托方法(设置高度约束) - 并从你的childViewController(TableView)调用它来更新高度。 – derdida

+0

我不知道你是否可以测试这个,但是,如果你没有顶层的滚动视图,会不会有问题? –

+0

请告诉我,如果我正确理解你的问题。你希望容器随着表视图数据的增加而增长(这将阻止它滚动,因为tableview的完整数据不会溢出),然后当它达到屏幕的总高度时,容器视图应该停止增长并且tableview会溢出并开始滚动? – kerry

回答

0

这是一个老问题,但希望它会帮助别人!我能够动态调整大小的容器做以适合其内容如下:

在我的嵌入式的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() 
    } 
} 
相关问题