ScrollView + UITableView
使用這種方法實現瀑布流的話,首先底層應該是一個 UIScrollView ,然后再 UIScrollView 上面添加 UITableView ,但是這個方法有很多不太好的地方,首先這兩個控件都可以單獨滾動,所以需要把 UITableView 的滾動禁止了,如果有很多列的話就需要很多個 UITableView,而且還需要單獨的管理每一列的東西,下標也不好計算
UICollectionView
使用這個方法,對比以上方法,UICollectionView 系統幫解決了cell的重用問題,而且不需要分列管理,在計算的時候也比較方便,所以大多數的瀑布流都使用 UICollectionView
實現思路
我們需要把每一個不同高度的cell填充到里面去,而且要保持長短的平均,所以我們需要每次都把cell放到所有列中短的那一列后邊拼接,這樣就可以實現長短不一了,然后再加上行跟列的間距以及邊緣寬度,就可以了。
實現
首先我們需要寫一個自定義布局,并且繼承于 UICollectionViewLayout
我們需要實現四個方法:
- (void)prepareLayout
- (NSArray *)layoutAttributesForElementsInRect:(CGRect)rect
- (UICollectionViewLayoutAttributes *)layoutAttributesForItemAtIndexPath:(NSIndexPath *)indexPath
- (CGSize)collectionViewContentSize
這四個方法作用分別是
/**
* 布局準備方法 初始化會被調用一次
* 當collectionView的布局發生變化時 會被調用
* 通常是做布局的準備工作 itemSize.....
*/
- (void)prepareLayout {
[super prepareLayout];
...
}
/**
* 所有cell的布局屬性
*/
- (NSArray *)layoutAttributesForElementsInRect:(CGRect)rect {
...
}
/**
* 返回indexPath位置cell對應的布局屬性
*/
- (UICollectionViewLayoutAttributes *)layoutAttributesForItemAtIndexPath:(NSIndexPath *)indexPath {
...
}
/**
* 內容大小
*
* @return 大小
*/
- (CGSize)collectionViewContentSize {
...
}
實現這個四個方法后,一個布局就寫好了
后的效果~
Demo代碼在github上的地址~~
本站文章版權歸原作者及原出處所有 。內容為作者個人觀點, 并不代表本站贊同其觀點和對其真實性負責,本站只提供參考并不構成任何投資及應用建議。本站是一個個人學習交流的平臺,網站上部分文章為轉載,并不用于任何商業目的,我們已經盡可能的對作者和來源進行了通告,但是能力有限或疏忽,造成漏登,請及時聯系我們,我們將根據著作權人的要求,立即更正或者刪除有關內容。本站擁有對此聲明的最終解釋權。