前序
之前公司給我分配了一個任務(wù),作為我實習(xí)期的一個考核。這個任務(wù)主要是使用RAC+MVVM去編寫的,其中有一個核心界面算是比較的復(fù)雜吧。這個界面其實就是一個UITableView,當(dāng)中有一個cell中包含了UICollectionView來顯示城市列表。因為每個城市的名字長度不一樣,所以也會涉及到UICollectionViewCell的布局問題。
核心界面的展示

難點
我們可以看到DAY1這個cell中包括一個UICollectionView來展示城市列表。這里的話有兩個地方需要注意一下:1.因為城市的字數(shù)有的長有的短,所有UICollectionViewCell的長度是不確定的,這樣導(dǎo)致UICollectionViewCell的布局并不是像現(xiàn)在這樣都是左對齊的,cell之間的間距并不是固定的。 ? ? ? ? ?2.cell的高度要根據(jù)UICollectionView展示內(nèi)容的高度變化而變化,確保能夠完全展示所有的城市列表(意思就是不用去滑動UICollectionView來查看城市列表)
對于第一個問題:在上面的布局中我們發(fā)現(xiàn)每兩個UICollectionViewCell之間的間隔是相等的,如果我們使用系統(tǒng)自動幫我們布局的話,cell之間的間隔將會不一樣。我們在SB中只能設(shè)置最小行間距和最小列間距,并不能設(shè)置固定間距。所以為了到達上面的效果,我們需要重寫UICollectionViewDelegateFlowLayout中的四個方法。? ?
?解決方法:1.先創(chuàng)建一個類(繼承UICollectionViewDelegateFlowLayout),重寫這四個方法。? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??
? ? ? ? ? ? ? ? ? ?2.設(shè)置UICollectionView的collectionViewLayout屬性值為我們剛剛創(chuàng)建的類。 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??

最主要的還是prepareLayout方法,在這個方法體中我們要自己計算每個cell的位置,保證每兩個cell之間的間距一定。
對于第二個問題:剛開始我想使用網(wǎng)上動態(tài)改變cell高度的三方庫(優(yōu)化UITableViewCell高度計算的那些事)去做的,但是這個三方庫在這里是無法使用的。因為UICollectionView本身就繼承UIScrollView,我們這里能夠改變的只是UICollectionView中cell的個數(shù),并不能改變UICollectionView的高度,因此也就無法用三方庫的方法去改變UITableViewCell的高度。 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
?解決方法:根據(jù)城市列表的數(shù)據(jù)源,計算出UICollectionView所需要的顯示高度,然后在heightForRowAtIndexPath方法中將計算出的高度賦值給對于的cell。計算高度的方法和上面計算每個UICollectionViewCell位置的方法思路是差不多的。
結(jié)束語
這篇文章可以說的還不是太詳細,解決方案也許也不是最好的。如果你有什么不理解的地方或者有更好的解決方法,歡迎留言交流。Github地址,算高方法 主要是Utils.m文件中changeCollectionViewHeight方法。