先上圖再解釋!

公司要求做一個(gè)這樣的一個(gè)頁面,剛接到這個(gè)需求,還容易就想到tableView 嵌套 collectionView。
下面一步一步說明實(shí)現(xiàn)的邏輯,首先肯定創(chuàng)建tableview,實(shí)現(xiàn)數(shù)據(jù)源方法,在自定義tableviewCell ,在上面添加collectionView ,這是一個(gè)很重要的點(diǎn)需要注意,tableviewcell 可以重用也可以不重用,可以給每個(gè)cell設(shè)置不同的重用標(biāo)識(shí)符,但是collectionViewCell 必須重用,也就是說tableviewCell上面創(chuàng)建了多個(gè)collectionview,多個(gè)collectionview可以重用同一個(gè)一個(gè)collectionviewcell 。
在創(chuàng)建tableviewcell的時(shí)候內(nèi)部創(chuàng)建collectionview,這個(gè)collectionview最好是懶加載的,因?yàn)閏ell的數(shù)據(jù)源方法會(huì)調(diào)用多次,也就會(huì)多次創(chuàng)建collectionview,懶加載保證cell沒有創(chuàng)建新的內(nèi)部的子控件collectionview 也不會(huì)創(chuàng)建多個(gè),在懶加載的時(shí)候設(shè)置好數(shù)據(jù)源和代理和布局屬性,我們這是要給cell設(shè)置不同的數(shù)據(jù)源(dataArray),cell的setDataArray的時(shí)候刷新內(nèi)部的collectionvView
其中還有一個(gè)UI的問題,就是每行cell距離左邊的距離和右邊的距離還有中間的距離一致,之前想給collectionView 的大小改變一下,不過這樣設(shè)置背景顏色的時(shí)候會(huì)有一些奇怪,具體的看你的項(xiàng)目,如果可以也可以這么設(shè)置,我現(xiàn)在用到的是flowLayOut的一個(gè)屬性sectionInset屬性,設(shè)置組內(nèi)的偏移量(flowlayout.sectionInset = UIEdgeInsetsMake(0, margin, 0, margin);),讓左邊和右邊都留出來一個(gè)間距margin,在設(shè)置flowLayOut 的minimumInteritemSpacingcell間距為margin,這樣在計(jì)算cell的大小為(屏幕的寬度 - 3*margin )/ 2 ,這就是每個(gè)cell的寬度,通過寬高比計(jì)算出高度
這樣基本就能顯示出來cell了,那么問題又來了,UI上面要加一條橫線,我們都知道collectionviewcell 是哪一個(gè)小塊,不想tableviewcell可以在底部加橫線,在考慮再三我選擇那個(gè)橫線用一個(gè)cell去做,也就是說兩個(gè)正常的cell中間返回一個(gè)橫線cell,這就要我們改掉數(shù)據(jù)源方法,需要計(jì)算出我們需要加多少個(gè)橫線cell,在加上普通的cell,一共才是總共的cell個(gè)數(shù),還有就是cell的大小不一樣了,正常的cell的大小還需要那么計(jì)算,但是線的cell的大小就變了,我們只需要遵循UICollectionViewDelegateFlowLayout這個(gè)代理,并實(shí)現(xiàn)代理方法-(CGSize)collectionView: layout: sizeForItemAtIndexPath: 判斷位置返回對(duì)應(yīng)大小的cell,代碼如下

數(shù)據(jù)源具體代碼:

