引
公司的項目中涉及到多列瀑布流趣斤、UITableView與sectionHeader的混合布局,之前的實現(xiàn)方式是以UITableView作為骨架执俩,將帶有瀑布流的UICollectionView封裝到自定義的UITableViewCell中蚂维,但是出現(xiàn)的問題就是當cell中瀑布流的元素過多時,會出現(xiàn)明顯的卡頓毙籽,而且布局復(fù)雜洞斯,層次較多,難以維護坑赡。故而重新自定義了collectionView的Layout烙如,在僅有一個collectionView的情況下完成了上述的布局。
更新:
2016-12-23
1毅否、加入了collectionHeaderView亚铁,類似UITableView 中的 tableHeaderView
2、將 sideMargin 改為 sectionInsets螟加,提高布局靈活度
項目基于Swift3.0~~
使用
閑話不多說徘溢,上代碼:
1、首先定義一個collectionview捆探,并設(shè)置layout的代理:
let layout = ZJFlexibleLayout(delegate: self)
//如果需要有 headerView 的話然爆,直接傳入即可,需提前設(shè)置frame
layout.collectionHeaderView = headerView
collectionView = UICollectionView(frame: kScreenBounds, collectionViewLayout: layout)
2黍图、遵守對應(yīng)的協(xié)議:
protocol ZJFlexibleLayoutDataSource: class{
//控制對應(yīng)section的瀑布流列數(shù)
func numberOfCols(at section: Int) -> Int
//控制每個cell的尺寸曾雕,實際上就是獲取寬高比
func sizeOfItemAtIndexPath(at indexPath : IndexPath) -> CGSize
//控制瀑布流cell的間距
func spaceOfCells(at section: Int) -> CGFloat
//section 內(nèi)邊距
func sectionInsets(at section: Int) -> UIEdgeInsets
//每個section的header尺寸
func sizeOfHeader(at section: Int) -> CGSize
//每個cell的額外高度
func heightOfAdditionalContent(at indexPath : IndexPath) -> CGFloat
}
協(xié)議詳解:
1.瀑布流列數(shù)
可以隨意設(shè)置瀑布流列數(shù),如果是單列的話就相當于tableView了
func numberOfCols(at section: Int) -> Int
2.cell尺寸
這個應(yīng)該不用多講吧雌隅,因為cell的寬度在列數(shù)確定時就已經(jīng)算出來了翻默,所以這個方法實質(zhì)上是獲取cell的寬高比
func sizeOfItemAtIndexPath(at indexPath : IndexPath) -> CGSize
3.cell間距
cell 的上下左右間距缸沃,注意不要跟sectionInsets搞混了
func spaceOfCells(at section: Int) -> CGFloat
4.section 內(nèi)邊距
這個是最近才加上的,可以讓每個section都有一個內(nèi)邊距
func sectionInsets(at section: Int) -> UIEdgeInsets
5.每個section的header尺寸
sectionHeader如果寬度小于屏寬修械,會自動居中
func sizeOfHeader(at section: Int) -> CGSize
6.cell的額外高度
此方法是專門公司項目的需求提出的趾牧,圖中標明的部分高度是不固定的,需要根據(jù)數(shù)據(jù)進行判斷
func heightOfAdditionalContent(at indexPath : IndexPath) -> CGFloat
結(jié)束語
代碼寫的沒什么條理肯污,所有東西都寫到一個文件里了(⊙﹏⊙)b翘单,后續(xù)應(yīng)該會用pod來管理
Demo已經(jīng)放到GitHub上了,歡迎大家Star蹦渣,也請大家不要吝嗇好的建議哈~~