前序
之前公司给我分配了一个任务,作为我实习期的一个考核。这个任务主要是使用RAC+MVVM去编写的,其中有一个核心界面算是比较的复杂吧。这个界面其实就是一个UITableView,当中有一个cell中包含了UICollectionView来显示城市列表。因为每个城市的名字长度不一样,所以也会涉及到UICollectionViewCell的布局问题。
核心界面的展示
难点
我们可以看到DAY1这个cell中包括一个UICollectionView来展示城市列表。这里的话有两个地方需要注意一下:1.因为城市的字数有的长有的短,所有UICollectionViewCell的长度是不确定的,这样导致UICollectionViewCell的布局并不是像现在这样都是左对齐的,cell之间的间距并不是固定的。 2.cell的高度要根据UICollectionView展示内容的高度变化而变化,确保能够完全展示所有的城市列表(意思就是不用去滑动UICollectionView来查看城市列表)
对于第一个问题:在上面的布局中我们发现每两个UICollectionViewCell之间的间隔是相等的,如果我们使用系统自动帮我们布局的话,cell之间的间隔将会不一样。我们在SB中只能设置最小行间距和最小列间距,并不能设置固定间距。所以为了到达上面的效果,我们需要重写UICollectionViewDelegateFlowLayout中的四个方法。
解决方法:1.先创建一个类(继承UICollectionViewDelegateFlowLayout),重写这四个方法。
2.设置UICollectionView的collectionViewLayout属性值为我们刚刚创建的类。
最主要的还是prepareLayout方法,在这个方法体中我们要自己计算每个cell的位置,保证每两个cell之间的间距一定。
对于第二个问题:刚开始我想使用网上动态改变cell高度的三方库(优化UITableViewCell高度计算的那些事)去做的,但是这个三方库在这里是无法使用的。因为UICollectionView本身就继承UIScrollView,我们这里能够改变的只是UICollectionView中cell的个数,并不能改变UICollectionView的高度,因此也就无法用三方库的方法去改变UITableViewCell的高度。
解决方法:根据城市列表的数据源,计算出UICollectionView所需要的显示高度,然后在heightForRowAtIndexPath方法中将计算出的高度赋值给对于的cell。计算高度的方法和上面计算每个UICollectionViewCell位置的方法思路是差不多的。
结束语
这篇文章可以说的还不是太详细,解决方案也许也不是最好的。如果你有什么不理解的地方或者有更好的解决方法,欢迎留言交流。Github地址,算高方法 主要是Utils.m文件中changeCollectionViewHeight方法。