首先我們先看一下 我們今天要最終實現的效果圖
UICollectionView的簡單介紹###
- UICollectionView的結構
Cells
Supplementary Views 追加視圖 (類似Header或者Footer)
Decoration Views 裝飾視圖 (用作背景展示)
-
由兩個方面對UICollectionView進行支持飘痛。
- 和tableView一樣拣展,即提供數據的UICollectionViewDataSource以及處理用戶交互的UICollectionViewDelegate。
另一方面,對于cell的樣式和組織方式,由于collectionView比tableView要復雜得多,因此沒有按照類似于tableView的style的方式來定義,而是專門使用了一個類來對collectionView的布局和行為進行描述,這就是
UICollectionViewLayout
令花。而我們主要講UICollectionViewLayout,因為這不僅是collectionView和tableView的最重要求的區(qū)別凉倚,也是整個UICollectionView的精髓所在兼都。
如果對UICollectionView的基本構成要素和使用方法還不清楚的話,可以查看:UICollectionView詳解中進行一些了解稽寒。
UICollectionViewLayoutAttributes類的介紹###
@property (nonatomic) CGRect frame
@property (nonatomic) CGPoint center
@property (nonatomic) CGSize size
@property (nonatomic) CATransform3D transform3D
@property (nonatomic) CGFloat alpha
@property (nonatomic) NSInteger zIndex
@property (nonatomic, getter=isHidden) BOOL hidden
可以看到薇芝,UICollectionViewLayoutAttributes的實例中包含了諸如邊框空镜,中心點椭豫,大小浆熔,形狀,透明度宏侍,層次關系和是否隱藏等信息赖淤。
1.一個cell對應一個UICollectionViewLayoutAttributes對象
2.UICollectionViewLayoutAttributes對象決定了cell的擺設位置(frame)
自定義的UICollectionViewLayout
- UICollectionViewLayout的功能為向UICollectionView提供布局信息,不僅包括cell的布局信息谅河,也包括追加視圖和裝飾視圖的布局信息咱旱。實現一個自定義layout的常規(guī)做法是繼承UICollectionViewLayout類,然后重載下列方法:
-(void)prepareLayout
準備方法被自動調用绷耍,以保證layout實例的正確吐限。
-(CGSize)collectionViewContentSize
返回collectionView的內容的尺寸
-(NSArray *)layoutAttributesForElementsInRect:(CGRect)rect
1.返回rect中的所有的元素的布局屬性
2.返回的是包含UICollectionViewLayoutAttributes的NSArray
3.UICollectionViewLayoutAttributes可以是cell,追加視圖或裝飾視圖的信息褂始,通過不同的UICollectionViewLayoutAttributes初始化方法可以得到不同類型的UICollectionViewLayoutAttributes:
1)layoutAttributesForCellWithIndexPath:
2)layoutAttributesForSupplementaryViewOfKind:withIndexPath:
3)layoutAttributesForDecorationViewOfKind:withIndexPath:
-(UICollectionViewLayoutAttributes )layoutAttributesForItemAtIndexPath:(NSIndexPath )indexPath
返回對應于indexPath的位置的cell的布局屬性
-(UICollectionViewLayoutAttributes )layoutAttributesForSupplementaryViewOfKind:(NSString )kind atIndexPath:(NSIndexPath *)indexPath
返回對應于indexPath的位置的追加視圖的布局屬性诸典,如果沒有追加視圖可不重載
-(UICollectionViewLayoutAttributes * )layoutAttributesForDecorationViewOfKind:(NSString)decorationViewKind atIndexPath:(NSIndexPath )indexPath
返回對應于indexPath的位置的裝飾視圖的布局屬性,如果沒有裝飾視圖可不重載
-(BOOL)shouldInvalidateLayoutForBoundsChange:(CGRect)newBounds
當邊界發(fā)生改變時崎苗,是否應該刷新布局狐粱。如果YES則在邊界變化(一般是scroll到其他地方)時赘阀,將重新計算需要的布局信息。
- 調用順序
1)-(void)prepareLayout 設置layout的結構和初始需要的參數等脑奠。
2) -(CGSize) collectionViewContentSize 確定collectionView的所有內容的尺寸。
3)-(NSArray *)layoutAttributesForElementsInRect:(CGRect)rect初始的layout的外觀將由該方法返回的UICollectionViewLayoutAttributes來決定幅慌。
4)在需要更新layout時宋欺,需要給當前l(fā)ayout發(fā)送
1)-invalidateLayout, 該消息會立即返回胰伍,并且預約在下一個loop的時候刷新當前l(fā)ayout
2)-prepareLayout齿诞,
3)依次再調用-collectionViewContentSize和-layoutAttributesForElementsInRect來生成更新后的布局。
LineLayout:流水布局實例http://www.reibang.com/p/a16ffb4bbcc2
流水布局
圓形布局CircleLayout http://www.reibang.com/p/83e31a2f18d9
圓形布局
方行布局http://www.reibang.com/p/58e06e1f2f6d
SquareLayout
瀑布流布局