UICollectionView介绍
UICollectionView类负责管理数据的有序集合以及自定义布局的模式来呈现数据,提供一些常用表格功能,此外还增加了单栏布局。也支持可以用于实现多列网格、平铺的布局、圆形的布局和更多的自定义布局,甚至你可以动态改变它的布局。
UICollectionView代码创建方式
UICollectionView *collectionView = [[UICollectionView alloc]initWithFrame:self.view.bounts collectionViewLayout:layout];
collectionView.delegate = self;
collectionView.dataSource = self;
[collectionView registerClass:[xxxCell class] forCellWithReuseIdentifier:@"cell"];
1.这个layout是什么呢?
UICollecitonViewLayout-是UICollecitonView特有的,负责其组成部分的cell,supplementary view和decoration view的组合。这三个view在后篇文章中会介绍。其能为三者设置各自的属性,包括:位置、大小、透明度、层级关系、形状等(存储在UICollectionViewLayoutAttributes,每个cell对应一个属于自己的UICollectionViewLayoutAttributes)。UICollectionView初始化都需要layout布局,可见其重要性。但是UICollectionViewLayout是一个抽象类,只定义了一些子类公有的属性和行为,不能直接使用。如果使用的话,则需要自己写布局。
UICollectionViewFlowLayout流式布局
UICollectionViewFlowLayout流式布局,苹果为我们设计非常灵活、通用的Layout。意思是UI控件会像流水一样,一行排满自动下一行排,这些布局都是苹果写好的。
UICollectionViewFlowLayout属性:
CGSize itemSize:定义所有的itemSize可以快捷给cell设置一样的大小(如果cell大小需求一样则可以用这个设置)。
CGFloat minimumLineSpacing:最小行间距
CGFloat minmumInteritemSpacing:最小cell之间的间距
UIEdgeInsets sectionInset:组内边距,设置的是UICollectionView整体的组内边距
CGSize headerReferenceSize:设置supplementary header View的大小
CGSize footerReferenceSize:设置supplementary header View的大小
UICollectionViewScrollDirection scrollDirection:设置UICollectionView的滚动放向
BOOL sectionHeadersPinToVisibleBounds:设置是否当元素超出屏幕之后固定头部试图位置,默认NO
BOOL sectionFootersPinToVisibleBounds:设置是否当元素超出屏幕之后固定尾部试图位置,默认NO
以上都是通过UICollectionViewFlowLayout来设置全局的布局,如果需要设置单独的每个item的属性则需要用UICollectionViewDelegateFlowLayout来设置。
UICollectionViewDelegateFlowLayout
//单独定制item的尺寸
- (CGSize)collectionView:(UICollectionView )collectionView layout:(UICollectionViewLayout)collectionViewLayout sizeForItemAtIndexPath:(NSIndexPath *)indexPath;
//定义每个UICollectionView的margin(间距),对每一个section单独设置边界,即内部cell上下左右距离header和footer的边界(间距)
- (UIEdgeInsets)collectionView:(UICollectionView )collectionView layout:(UICollectionViewLayout)collectionViewLayout insetForSectionAtIndex:(NSInteger)section;
//单独定制每行之间的间距
- (CGFloat)collectionView:(UICollectionView )collectionView layout:(UICollectionViewLayout)collectionViewLayout minimumLineSpacingForSectionAtIndex:(NSInteger)section;
//单独定制每行item之间的间距
- (CGFloat)collectionView:(UICollectionView )collectionView layout:(UICollectionViewLayout)collectionViewLayout minimumInteritemSpacingForSectionAtIndex:(NSInteger)section;
//单独定制头部视图size
- (CGSize)collectionView:(UICollectionView )collectionView layout:(UICollectionViewLayout)collectionViewLayout referenceSizeForHeaderInSection:(NSInteger)section;
//单独定制脚注视图size
- (CGSize)collectionView:(UICollectionView )collectionView layout:(UICollectionViewLayout)collectionViewLayout referenceSizeForFooterInSection:(NSInteger)section;
UICollectionViewDataSource
UICollectionViewDataSource跟UITableViewDataSource类似。
//设置section组数
- (NSInteger)numberOfSectionsInCollectionView:(UICollectionView *)collectionView;
//设置item个数
- (NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section;
//配置cell
- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath;
//自定义头部、脚注视图
- (UICollectionReusableView *)collectionView:(UICollectionView *)collectionView viewForSupplementaryElementOfKind:(NSString *)kind atIndexPath:(NSIndexPath *)indexPath;
UIScrollViewDelegate
UIScrollViewDelegate也和UITableViewDelegate类似功能,但有独特的代理方法
//设置是否允许选中
- (BOOL)collectionView:(UICollectionView *)collectionView shouldSelectItemAtIndexPath:(NSIndexPath *)indexPath;
//设置是否允许取消选中
- (BOOL)collectionView:(UICollectionView *)collectionView shouldDeselectItemAtIndexPath:(NSIndexPath *)indexPath;
//选中
- (void)collectionView:(UICollectionView *)collectionView didSelectItemAtIndexPath:(NSIndexPath *)indexPath;
//取消选中
- (void)collectionView:(UICollectionView *)collectionView didDeselectItemAtIndexPath:(NSIndexPath *)indexPath;
一定要注册cell不然会爆这样的错误
*** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'could not dequeue a view of kind: UICollectionElementKindCell with identifier myCell - must register a nib or a class for the identifier or connect a prototype cell in a storyboard'
初步使用这些,就能简单的使用collectionView