标题比较长,项目中遇到需要用tableivew和collectionview在一个页面显示,并且两个控件里的内容需要全部展开来通过一个ScrollView来进行统一滚动的需求.
思路很简单,去掉tableview和collectionview的滚动,然后将它们放到scrollview中来滚动查看其中的内容,同时使用tableview和collectionview的自动布局减少代码量和复杂度。
核心代码:
override func viewDidLayoutSubviews() {
//第一次触发时是0,不能直接用
if collectionView.contentSize.height > 0 {
//collectionview的高度约束=内容高度
collectionHeightConstraint.constant = collectionView.contentSize.height
}
//scrollview的内容高度=collectionview的内容高度+tableview的内容高度
contentViewConstraint.constant = tableView.contentSize.height + collectionView.contentSize.height
}
简单的理解就是事先设置好collectionview(也可以是tableview的)的高度约束,再当控制器的内容布局完成之后,跟据collectionview的内容高度重新设置其高度约束=内容高度,这样collectionview的内容就完全展示了出来了;然后再设置好scrollview的内容高度=collectionview的内容高度+tableview的内容高度.
注意:viewDidLayoutSubviews在页面启动后会执行两次,第一次执行,由tableview布局完成时触发,而这时的collectionView.contentSize.height = 0,所以要加个判断条件,否则collectionHeightConstraint.constant 一旦设置0之后,collectionview的代理方法不会执行,我们将会看不到collectionview的内容.
具体的代码:
https://github.com/ghyh22/TableViewCollectionViewAutoHeight