UICollectionView使用方法(一)
UICollectionView简介:
UITableView的胞弟,都是继承自UIScrollView,都是由Datasource和Delegate驱动的,但是它在UITableView的基础上又做了扩展,以用来构建更复杂的布局。
我们先写一个小例子,简单介绍一下UIColletionView:
- (void)loadUI{
//初始化
UICollectionViewFlowLayout *flowLayout = [[UICollectionViewFlowLayout alloc] init];
//设置滑动方向
[flowLayout setScrollDirection:UICollectionViewScrollDirectionVertical];
self.collectionView = [[UICollectionView alloc]initWithFrame:CGRectMake(0, 0, WIDTH,HEIGHT) collectionViewLayout:flowLayout];
//注册
[self.collectionView registerClass:[UICollectionViewCell class] forCellWithReuseIdentifier:@"cell"];
self.collectionView.delegate = self;
self.collectionView.dataSource = self;
[self.view addSubview:self.collectionView];
}
为什么有一个UICollectionViewFlowLayout,什么东东?
UICollectionViewFlowLayout:UICollectionViewLayout这个类只是一个基类,我们给UICollectionView使用的都是它的子类。系统为我们提供了一个最常用的layout为UICollectionViewFlowLayout,我们可以使用它制作grid view。当UICollectionViewLayout满足不了我们的需求时,我们可以子类化UICollectionViewLayout或者自定义layout。
大白话是这么说的:datasource和deledate为提供我们提供了cell,UICollectionViewFlowLayout为这个cell布局,想要做成自己想要的样子,就重写这个布局类!
我们看看这个类都提供了哪些属性:
//同一组当中,垂直方向:行与行之间的间距;水平方向:列与列之间的间距
@property (nonatomic) CGFloat minimumLineSpacing;
//垂直方向:同一行中的cell之间的间距;水平方向:同一列中,cell与cell之间的间距
@property (nonatomic) CGFloat minimumInteritemSpacing;
//每个cell统一尺寸
@property (nonatomic) CGSize itemSize;
//滑动反向,默认滑动方向是垂直方向滑动
@property (nonatomic) UICollectionViewScrollDirection scrollDirection;
//每一组头视图的尺寸。如果是垂直方向滑动,则只有高起作用;如果是水平方向滑动,则只有宽起作用。
@property (nonatomic) CGSize headerReferenceSize;
//每一组尾部视图的尺寸。如果是垂直方向滑动,则只有高起作用;如果是水平方向滑动,则只有宽起作用。
@property (nonatomic) CGSize footerReferenceSize;
//每一组的内容缩进
@property (nonatomic) UIEdgeInsets sectionInset;
好,我们接着分析:
为什么要早早的注册啊,难道不能没有这个对象的时候再创建吗?不行~UICollectionView和UITableView这点不一样,UICollectionView需要先注册到重用池,等需要的时候再去池里面取,如果像UITableView那样如果cell不存在的时候再去创建,就崩了~
注册方法两种:
- (void)registerClass:(nullable Class)cellClass forCellWithReuseIdentifier:(NSString *)identifier;
- (void)registerNib:(nullable UINib *)nib forCellWithReuseIdentifier:(NSString *)identifier;
//下面两个为注册补充视图,就是你需要创建头啊,尾啊的,就注册吧!好奇葩,这个也要注册
- (void)registerClass:(nullable Class)viewClass forSupplementaryViewOfKind:(NSString *)elementKind withReuseIdentifier:(NSString *)identifier;
- (void)registerNib:(nullable UINib *)nib forSupplementaryViewOfKind:(NSString *)kind withReuseIdentifier:(NSString *)identifier;
如果上面的满足不了你那个大牛的心,你尽可以扩展!
注册之后,我们就可以去重用了。
//每个UICollectionView展示的内容
-(UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath
{
static NSString * CellIdentifier = @"cell";
//重用池取
UICollectionViewCell * cell = [collectionView dequeueReusableCellWithReuseIdentifier:CellIdentifier forIndexPath:indexPath];
cell.backgroundColor = [UIColor colorWithRed:((10 * indexPath.row) / 255.0) green:((20 * indexPath.row)/255.0) blue:((30 * indexPath.row)/255.0) alpha:1.0f];
UILabel *label = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, 30, 20)];
label.textColor = [UIColor redColor];
label.text = [NSString stringWithFormat:@"%d",indexPath.row];
for (id subView in cell.contentView.subviews) {
[subView removeFromSuperview];
}
[cell.contentView addSubview:label];
return cell;
}
UITableView可以设置行高啊,分区头高啊,我们这个怎么设置cell样式啊?我们看看几个代理方法:
//每一个cell的大小
- (CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout*)collectionViewLayout sizeForItemAtIndexPath:(NSIndexPath *)indexPath;
//设置每组的cell的边界
- (UIEdgeInsets)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout*)collectionViewLayout insetForSectionAtIndex:(NSInteger)section;
//cell的最小行间距
- (CGFloat)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout*)collectionViewLayout minimumLineSpacingForSectionAtIndex:(NSInteger)section;
//cell的最小列间距
- (CGFloat)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout*)collectionViewLayout minimumInteritemSpacingForSectionAtIndex:(NSInteger)section;
//头部相关
- (CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout*)collectionViewLayout referenceSizeForHeaderInSection:(NSInteger)section;
//尾部相关
- (CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout*)collectionViewLayout referenceSizeForFooterInSection:(NSInteger)section;
好,我们看一下一个简单的collection布局:
IMG_4719.jpg还有更多功能只得去研究,去扩展~
奋斗不息~