手把手教你使用UICollectionView写公司的项目,UIC

作者:澳门新葡京平台游戏

澳门新葡京平台游戏 1公司的UI图

UICollectionView是一种类似于UITableView但又比UITableView功能更强大、更灵活的视图,这是源于它将UICollectionView对cell的布局交给了UICollectionViewLayout,而且允许用户自定义layout来进行布局。

初始化:

在很多app中都有这样通用的页面,一直没有机会使用UICollectionView,只是简单的看过他的使用方法。今天公司美工出图,使用了他,并且遇到了好多的坑。记录一下过程,不确定使用的方法是不是最优的,如果有更好的方案,一起讨论,一起进步

下面是UICollectionView合并内容和布局并生成最终界面的一个流程:

//初始化布局类(UICollectionViewLayout的子类)
UICollectionViewFlowLayout *fl = [[UICollectionViewFlowLayout alloc]init];

理论篇

澳门新葡京平台游戏 2

//初始化collectionView
self.collectionView = [[UICollectionView alloc]initWithFrame:CGRectZero collectionViewLayout:fl];

一.UICollectionViewLayout是做什么的?

澳门新葡京平台游戏,1.1 在创建UITableView的时候,使用的是- (instancetype)initWithFrame:frame style:(UITableViewStyle)style用于判断是普通还是分组,1.2 UICollectionViewLayout实际的作用是一样的,是用来设置cell的布局的,初始化collectionView的时候,一定要给他设置这个属性,否者不会显示。UICollectionViewFlowLayoutUICollectionViewLayout的子类,给collectionView赋值的时候,一定要使用** UICollectionViewFlowLayout**初始化。1.3 UICollectionViewFlowLayoutUICollectionViewLayout的关系就像是UIGestureRecognizerUITapGestureRecognizer的一样。一个是父类,一个是子类。使用的时候都用子类

当UICollectionView显示内容时,先从Data source(数据源)获取cell,然后交给UICollectionView。再从UICollectionViewLayout获取对应的layout attributes(布局属性)。最后,根据每个cell对应的layout attributes(布局属性)来对cell进行布局,生成了最终的界面。而用户交互的时候,都是通过Delegate来进行交互。当然,上面只是布局cell,但是UICollectionView内部还有Supplementary View和Decoration View,也可以对其进行布局。

//设置代理
self.collectionView.delegate = self;
self.collectionView.dataSource = self;

二. UICollectionViewLayout的属性

澳门新葡京平台游戏 3每一个绿色款都是cell

如果都是固定的,建议生成layout对象的时候,设置全局属性,(其布局很有意思,当你的cell设置大小后,一行多少个cell,由cell的宽度决定)

NS_CLASS_AVAILABLE_IOS @interface UICollectionViewFlowLayout : UICollectionViewLayout //每行之间竖直之间的最小间距  @property (nonatomic) CGFloat minimumLineSpacing;//同行的cell与cell之间水平之间的最小间距@property (nonatomic) CGFloat minimumInteritemSpacing; //每个cell的尺寸,如果都是上图的那种,整个collectionView都是同一种,那么可以用整个属性,如果想我们公司那样的样式,不建议设置该属性@property (nonatomic) CGSize itemSize; //预估cell的尺寸,ios8之后可以先去预估cell的尺寸,然后去自适应@property (nonatomic) CGSize estimatedItemSize NS_AVAILABLE_IOS; // defaults to CGSizeZero - setting a non-zero size enables cells that self-size via -perferredLayoutAttributesFittingAttributes: //滑动的方向,水平或者竖直,看到很多图片浏览器都是用collectionview做出来的(注册之后,可以复用),非常的好用!但是要记住,水平滑动只有collectionview有,tableview不支持的,默认竖直方法滑动@property (nonatomic) UICollectionViewScrollDirection scrollDirection; // default is UICollectionViewScrollDirectionVertical //组头组尾的size@property (nonatomic) CGSize headerReferenceSize; @property (nonatomic) CGSize footerReferenceSize; //组的四周切的范围@property (nonatomic) UIEdgeInsets sectionInset; @end 

minimumLineSpacing 属性详解

澳门新葡京平台游戏 4绿色是minimumLineSpacing最新行间距澳门新葡京平台游戏 5蓝色是实际的行间距澳门新葡京平台游戏 6在实际开发过程中,很可能行间距会是不同的

sectionInset 属性详解

澳门新葡京平台游戏 7sectionInset的配图,每个组装有很多的cell,默认该属性是0,如图澳门新葡京平台游戏 8但是有的是时候我们会往里面切图,整个组往里面切,里面的cell也跟着移动

注意,我刚才说的,如果所有的cell都是一样尺寸,我们可以设置初始化layout之后,直接赋值,如果想我们公司那样,随意可能改变,建议看看下边的代理方法

上面,我们了解了UICollectionView的工作流程,我们将UICollectionView分成视图、数据源和代理方法、UICollectionViewLayout三块来介绍。


三. UICollectionViewLayout的代理方法

3.1 过去我们使用UITableView的时候,直接声明数据源方法,和代理方法,3.2 使用UICollectionView的时候,也要声明两个。1.UICollectionViewDelegateFlowLayout``2.UICollectionViewDataSource,因为1中包含了3.UICollectionViewDelegate,所以可以省略3

#pragma mark - UICollectionViewDelegateFlowLayout //每个cell的大小,因为有indexPath,所以可以判断哪一组,或者哪一个item,可一个给特定的大小,等同于layout的itemSize属性- collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout*)collectionViewLayout sizeForItemAtIndexPath:(NSIndexPath *)indexPath { return CGSizeMake; } // 设置整个组的缩进量是多少- (UIEdgeInsets)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout*)collectionViewLayout insetForSectionAtIndex:(NSInteger)section { return UIEdgeInsetsMake(5, 5, 5, 5); } // 设置最小行间距,也就是前一行与后一行的中间最小间隔 - collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout*)collectionViewLayout minimumLineSpacingForSectionAtIndex:(NSInteger)section { return 10; } // 设置最小列间距,也就是左行与右一行的中间最小间隔 - collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout*)collectionViewLayout minimumInteritemSpacingForSectionAtIndex:(NSInteger)section { return 10; } // 设置section头视图的参考大小,与tableheaderview类似 - collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout*)collectionViewLayout referenceSizeForHeaderInSection:(NSInteger)section { return CGSizeMake(self.view.frame.size.width, 40); } // 设置section尾视图的参考大小,与tablefooterview类似 - collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout*)collectionViewLayout referenceSizeForFooterInSection:(NSInteger)section { return CGSizeMake(self.view.frame.size.width, 40); } 

一、视图

UICollectionView上面显示内容的视图有三种Cell视图、Supplementary View和Decoration View。

Cell视图

CollectionView中主要的内容都是由它展示的,它是从数据源对象获取的。

Supplementary View

它展示了每一组当中的信息,与cell类似,它是从数据源方法当中获取的,但是与cell不同的是,它并不是强制需要的。例如flow layout当中的headers和footers就是可选的Supplementary View。

Decoration View

这个视图是一个装饰视图,它没有什么功能性,它不跟数据源有任何关系,它完全属于layout对象。

需要实现的协议:
UICollectionViewDataSource, UICollectionViewDelegateFlowLayout
PS:UICollectionViewDelegateFlowLayout是UICollectionViewDelegate的子协议

四. UICollectionView的组头和组尾

澳门新葡京平台游戏 9组头和足尾

1.UICollectionView中非常明确是以为单位,可以设置组的组头和尾巴,这里的头尾还可以复用2.复用的时候,首先头尾view要继承于UICollectionReusableView,然后注册(分为nib和class两种)3.用的时候通过collectionView去dequeue一下获取,和cell的思路一样4.可以使用上文中的layout属性直接设置组头和组尾的size,也可以使用代理方法,去设置

二、数据源和代理方法

1、注册cell或者Supplementary View使其重用

在使用数据源返回cell或者Supplementary View给collectionView之前,我们必须先要注册,用来进行重用。

registerClass: forCellWithReuseIdentifier:

registerNib: forCellWithReuseIdentifier:

registerClass: forSupplementaryViewOfKind: withReuseIdentifier:

registerNib: forSupplementaryViewOfKind: withReuseIdentifier:

显而易见,前面两个方法是注册cell,后两个方法注册Supplementary View。其中,注册的方式有两种,第一种是直接注册class,它重用的时候会调用[[UICollectionView alloc] init]这样的初始化方法创建cell;另外一种是注册nib,它会自动加载nib文件。

注册的之后,我们如何重用?

在数据源方法当中返回 cell 或者 Supplementary view 的方法当中通过 dequeueReusableCellWithReuseIdentifier:forIndexPath: 或者 dequeueReusableSupplementaryViewOfKind:withReuseIdentifier:forIndexPath: 方法获取cell或者Supplementary View。

示例代码:

- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath{

CollectionViewCell *cell = (CollectionViewCell *)[collectionView dequeueReusableCellWithReuseIdentifier:CellReuseIdentify forIndexPath:indexPath];

cell.backgroundColor = [UIColor lightGrayColor];

cell.textLabel.text = [NSString stringWithFormat:@"(%zd,%zd)", indexPath.section, indexPath.row];

return cell;

}

2、数据源方法

数据源方法与UITableView类似,主要有:

numberOfSectionsInCollectionView:

collectionView: numberOfItemsInSection:

collectionView: cellForItemAtIndexPath:

collectionView: viewForSupplementaryElementOfKind: atIndexPath:

与UITableView不同的是多加了返回Supplementary view数据源方法。

3、代理方法

数据源为UICollectionView提供数据相关的内容,而代理则主要负责用户交互、与数据无关的视图外形。主要分成两部分:

1、通过调用代理方法,管理视图的选中、高亮

collectionView:shouldDeselectItemAtIndexPath:

collectionView:didSelectItemAtIndexPath:

collectionView:didDeselectItemAtIndexPath:

collectionView:shouldHighlightItemAtIndexPath:

collectionView:didHighlightItemAtIndexPath:

collectionView:didUnhighlightItemAtIndexPath:

2、长按cell,显示编辑菜单 当用户长按cell时,collection view视图会显示一个编辑菜单。这个编辑菜单可以用来剪切、复制和粘贴cell。不过,要显示这个编辑菜单需要满足很多条件:

代理对象必须实现下面三个方法:

collectionView:shouldShowMenuForItemAtIndexPath: collectionView:canPerformAction:forItemAtIndexPath:withSender: collectionView:performAction:forItemAtIndexPath:withSender:

对于指定要编辑的cell, collectionView:shouldShowMenuForItemAtIndexPath: 方法需要返回 YES

collectionView:canPerformAction:forItemAtIndexPath:withSender: 方法中,对于剪切、复制、粘贴三种action至少有一个返回YES。其实,编辑菜单是有很多种action的,但是对于UICollectionView来说,它仅仅支持的剪切、复制、粘贴三个,所以说这个代理方法至少支持这三种的一种。

剪切、复制、粘贴的方法名是:

cut: copy: paste:

当上面的条件都满足了,用户就可以长按cell显示出编辑菜单,然后选择对应的action,从而就会回调delegate的collectionView:performAction:forItemAtIndexPath:withSender: 方法去做对应的事情。

当我们想控制编辑菜单仅仅显示复制和粘贴时,我们就可以在 collectionView:canPerformAction:forItemAtIndexPath:withSender: 方法中进行操作,具体请见下面代码:

- (BOOL)collectionView:(UICollectionView *)collectionView canPerformAction:(SEL)action forItemAtIndexPath:(NSIndexPath *)indexPath withSender:(id)sender{

if ([NSStringFromSelector(action) isEqualToString:@"copy:"]

|| [NSStringFromSelector(action) isEqualToString:@"paste:"])

return YES;

return NO;

}


五. UICollectionView的数据源方法

和tableview的数据源方法一样,想要成为其数据源,然后声明数据源

#pragma mark - UICollectionViewDataSource // 指定Section个数 - (NSInteger)numberOfSectionsInCollectionView:(UICollectionView *)collectionView { return 3; } // 指定section中的collectionViewCell的个数 - (NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section { return 10; } // 配置section中的collectionViewCell的显示 - (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath { CollectionViewCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:@"CellIdentifier" forIndexPath:indexPath]; cell.backgroundColor = [UIColor redColor]; cell.textLabel.text = [NSString stringWithFormat:@"", indexPath.section, indexPath.row]; return cell; } 

三、UICollectionViewLayout

UICollectionViewLayout 是UICollectionView比UITableView更强大原因,它是UICollectionView的精髓,它通过 UICollectionViewLayoutAttributes 类来管理 cell 、 Supplementary View 和 Decoration View 的 位置 、 transform 、 alpha 、 hidden 等等。

UICollectionViewLayout这个类只是一个基类,我们给UICollectionView使用的都是它的 子类 。系统为我们提供了一个最常用的layout为 UICollectionViewFlowLayout ,我们可以使用它制作 grid view 。当UICollectionViewLayout满足不了我们的需求时,我们可以 子类化UICollectionViewLayout 或者 自定义layout ,这个内容放到我下一篇当中。

下面,我们来看看怎么使用UICollectionViewFlowLayout。 使用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;

上面是UICollectionViewFlowLayout内部的属性,这些属性都是统一设置,若是统一设置无法满足需求,可以实现 UICollectionViewDelegateFlowLayout 方法,进行对应的设置。

了解了UICollectionViewFlowLayout主要属性,我们再来看看使用步骤:

1、生成一个UICollectionViewFlowLayout对象给collection view

2、通过itemSize来配置cell的宽和高

3、如果有需要通过设置minimumInteritemSpacing来设置每个cell之间的间距,通过minimumLineSpacing来设置同一组当中不同行之间cell的行距。

4、如果想要组头视图或者组尾视图,指定它们的大小

5、设置layout的滑动方向

6、如果统一设置无法满足需求,实现UICollectionViewDelegateFlowLayout方法来进行设置。

注册相应的UICollectionViewCell子类到collectionView用来从队列提取和显示

六. UICollectionView的代理方法
#pragma mark - UICollectionViewDelegate // 允许选中时,高亮 - collectionView:(UICollectionView *)collectionView shouldHighlightItemAtIndexPath:(NSIndexPath *)indexPath { NSLog(@"%s", __FUNCTION__); return YES; } // 高亮完成后回调 - collectionView:(UICollectionView *)collectionView didHighlightItemAtIndexPath:(NSIndexPath *)indexPath { NSLog(@"%s", __FUNCTION__); } // 由高亮转成非高亮完成时的回调 - collectionView:(UICollectionView *)collectionView didUnhighlightItemAtIndexPath:(NSIndexPath *)indexPath { NSLog(@"%s", __FUNCTION__); } // 设置是否允许选中 - collectionView:(UICollectionView *)collectionView shouldSelectItemAtIndexPath:(NSIndexPath *)indexPath { NSLog(@"%s", __FUNCTION__); return YES; } // 设置是否允许取消选中 - collectionView:(UICollectionView *)collectionView shouldDeselectItemAtIndexPath:(NSIndexPath *)indexPath { NSLog(@"%s", __FUNCTION__); return YES; } // 选中操作 - collectionView:(UICollectionView *)collectionView didSelectItemAtIndexPath:(NSIndexPath *)indexPath { NSLog(@"%s", __FUNCTION__); } // 取消选中操作 - collectionView:(UICollectionView *)collectionView didDeselectItemAtIndexPath:(NSIndexPath *)indexPath { NSLog(@"%s", __FUNCTION__); } 
  • (void)registerClass:(Class)cellClass forCellWithReuseIdentifier:(NSString *)identifier;
    PS:如果是用nib创建的话,使用下面这个函数来注册。
  • (void)registerNib:(UINib *)nib forCellWithReuseIdentifier:(NSString *)identifier;

实战篇

如果需要显示每个section的headerView或footerView,则还需注册相应的UICollectionReusableView的子类到collectionView
elementKind是header或footer的标识符,只有两种可以设置UICollectionElementKindSectionHeader和UICollectionElementKindSectionFooter

一. 将设计图分解成合理结构

澳门新葡京平台游戏 10被分解后的设计图

分解原因及说明

0.创建控制器(继承自UICollectionViewController),然后创建基本的layout,给某些固定的数据赋值

 UICollectionViewFlowLayout * layout = [[UICollectionViewFlowLayout alloc] init]; layout.minimumInteritemSpacing = 0; layout.minimumLineSpacing = 9;layout.sectionInset = UIEdgeInsetsMake(0, 9, 0, 9); layout.scrollDirection = UICollectionViewScrollDirectionVertical; THFindController * discoverVC = [[THFindController alloc] initWithCollectionViewLayout:layout]; discoverVC.title = @"发现";

1.说了一顿,特意说明,UICollectionView是很强调这个概念,有组头组尾这两个概念,但一直没有提到tableHeaderView这样的控件,所以我们将1 2 间隔 3封装成第一组的headerView(封装的类名是THFineAdView),继承自UICollectionReusableView(继承自UIView,没啥功能,除了复用)

2.将5也集成字UICollectionReusableView封装一下

3.封装完毕之后,要去注册一下,注册的使用,分为nib,和class注册

3.1 第一组的headerView是同纯代码封装的,所以注册的时候这样

 [self.collectionView registerClass:[THFineAdView class] forSupplementaryViewOfKind:UICollectionElementKindSectionHeader withReuseIdentifier:kTHFindAdViewIden];

3.2 第二组的headerView使用的是nib方式,所以也要注册一下

 UINib * nib = [UINib nibWithNibName:@"THFindStyleHeaderView" bundle:nil]; [self.collectionView registerNib:nib forSupplementaryViewOfKind:UICollectionElementKindSectionHeader withReuseIdentifier:kTHFindStyleHeaderViewIden];

3.3 (模块4和模块5之间的间隙,模块6和模块7之间的间隙)可以通过sectionInset来实现,但是我认为成为组1,组2的sectionFooter更加靠谱一些。那就注册一下

 [self.collectionView registerClass:[THFindSectionFooterView class] forSupplementaryViewOfKind:UICollectionElementKindSectionFooter withReuseIdentifier:kFooterViewIden];

注意 UICollectionElementKindSectionHeader这个代表头的意思,如果注册尾巴,使用UICollectionElementKindSectionFooter注册的三个方法应该写在一起

4.调用组头和组尾

#pragma mark - collectionview的代理方法- (UICollectionReusableView *)collectionView:(UICollectionView *)collectionView viewForSupplementaryElementOfKind:(NSString *)kind atIndexPath:(NSIndexPath *)indexPath{//先通过kind类型判断是头还是尾巴,然后在判断是哪一组,如果都是一样的头尾,那么只要第一次判断就可以了 if (kind == UICollectionElementKindSectionHeader){ if (indexPath.section == 0) { THFineAdView *view = [collectionView dequeueReusableSupplementaryViewOfKind:UICollectionElementKindSectionHeader withReuseIdentifier:kTHFindAdViewIden forIndexPath:indexPath]; view.bannerArr = self.bannerArr; return view; } else if(indexPath.section == 1){ THFindStyleHeaderView * view = [collectionView dequeueReusableSupplementaryViewOfKind:UICollectionElementKindSectionHeader withReuseIdentifier:kTHFindStyleHeaderViewIden forIndexPath:indexPath]; view.titleLab.text = @"推荐用户"; return view; } } else{ UICollectionReusableView *footer = [collectionView dequeueReusableSupplementaryViewOfKind:UICollectionElementKindSectionFooter withReuseIdentifier:kFooterViewIden forIndexPath:indexPath]; return footer; } return nil;}

5.调用组头和组尾的高度

设置头和尾的size,要用两个代理方法,使用代理方法的好处在于可以分情况判断

 // 设置section头视图的参考大小,与tableheaderview类似- collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout*)collectionViewLayoutreferenceSizeForHeaderInSection:(NSInteger)section { if(section == 0){ return CGSizeMake(ScreenWidth, [THFineAdView adViewHeight]); }else if(section == 1){ return CGSizeMake(ScreenWidth, [THFindStyleHeaderView findStyleHeight]); }else{ return CGSizeZero; }}- collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout*)collectionViewLayoutreferenceSizeForFooterInSection:(NSInteger)section{ return CGSizeMake(ScreenWidth, 10*THScreenScaleNum);}

6.数据源方法

#pragma mark <UICollectionViewDataSource>- (NSInteger)numberOfSectionsInCollectionView:(UICollectionView *)collectionView { NSInteger pre = (self.preArr.count != 0); NSInteger next = (self.nextArr.count != 0); NSInteger users = (self.userArr.count != 0); return pre next users;}- (NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section { if (section == 0) { return 4; }else if(section == 1){ return 1; }else{ return self.nextArr.count; } return 0;}- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath { UICollectionViewCell * cell = nil; if (indexPath.section == 0) { THRecommendCell *recCell = [THRecommendCell recommendCellWithCollectionView:collectionView indePath:indexPath]; recCell.twitterM = self.preArr[indexPath.item]; cell = recCell; }else if (indexPath.section == 1){ THRecommendUsersCell * userCell = [THRecommendUsersCell cellWithColletionView:collectionView indexPath:indexPath]; userCell.users = self.userArr; cell = userCell; }else{ THRecommendCell *rCell = [THRecommendCell recommendCellWithCollectionView:collectionView indePath:indexPath]; rCell.twitterM = self.nextArr[indexPath.item]; cell = rCell; } return cell;}

7.在使用自定义cell之前一定要注册,否者不能复用,给系统造成很大的压力,经常卡顿

//我是自定义了一个方法,传递indexPAth和collectionview直接注册  (instancetype)recommendCellWithCollectionView:(UICollectionView *)collectionView indePath:(NSIndexPath *)indexPath{ [collectionView registerClass:[self class] forCellWithReuseIdentifier:@"THRecommendCell"]; return [collectionView dequeueReusableCellWithReuseIdentifier:@"THRecommendCell" forIndexPath:indexPath];}

8.如何自定义cell

他的自定义非常简单,就几个方法

#pragma mark - 直接写这个方法- (instancetype)initWithFrame:frame{ if (self = [super initWithFrame:frame]) { [self createSub]; } return self;}- createSub{ self.contentView.backgroundColor = [UIColor whiteColor]; //1.图片 [self.contentView addSubview:self.iconImage]; //2.题目 [self.contentView addSubview:self.titleLab]; //3.喜欢数 [self.contentView addSubview:self.likeBtn]; //4.评论数 [self.contentView addSubview:self.recommentBtn];}#pragma mark - 布局- updateConstraints{ [super updateConstraints]; //图片}

如果是xib加载的话,最多有个awakeFromNib和view的一样使用

9.代理方法,就懒得写了

如果各位同行有什么好的建议,可以告诉我,我会虚心接受,再次修改本文的,一起进步~ 顺便给有个好文章,可以看看 参考文档

  • (void)registerClass:(Class)viewClass forSupplementaryViewOfKind:(NSString *)elementKind withReuseIdentifier:(NSString *)identifier;
    PS:如果是用nib创建的话,使用下面这个函数来注册。
  • (void)registerNib:(UINib *)nib forSupplementaryViewOfKind:(NSString *)kind withReuseIdentifier:(NSString *)identifier;

实现协议的函数:
跟UITableView的DataSource和Delegate很像,大可自行代入理解。

DataSource:

//每一组有多少个cell

  • (NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section;

//定义并返回每个cell

  • (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath;

//collectionView里有多少个组

  • (NSInteger)numberOfSectionsInCollectionView:(UICollectionView *)collectionView;

//定义并返回每个headerView或footerView

  • (UICollectionReusableView *)collectionView:(UICollectionView *)collectionView viewForSupplementaryElementOfKind:(NSString *)kind atIndexPath:(NSIndexPath *)indexPath;

上面这个方法使用时必须要注意的一点是,如果布局没有为headerView或footerView设置size的话(默认size为CGSizeZero),则该方法不会被调用。所以如果需要显示header或footer,需要手动设置size。
可以通过设置UICollectionViewFlowLayout的headerReferenceSize和footerReferenceSize属性来全局控制size。或者通过重载以下代理方法来分别设置

  • (CGSize)collectionView:(UICollectionView )collectionView layout:(UICollectionViewLayout)collectionViewLayout referenceSizeForHeaderInSection:(NSInteger)section;
  • (CGSize)collectionView:(UICollectionView )collectionView layout:(UICollectionViewLayout)collectionViewLayout referenceSizeForFooterInSection:(NSInteger)section;

Delegate:

//每一个cell的大小

  • (CGSize)collectionView:(UICollectionView )collectionView layout:(UICollectionViewLayout)collectionViewLayout sizeForItemAtIndexPath:(NSIndexPath *)indexPath;

//设置每组的cell的边界, 具体看下图

  • (UIEdgeInsets)collectionView:(UICollectionView )collectionView layout:(UICollectionViewLayout)collectionViewLayout insetForSectionAtIndex:(NSInteger)section;

澳门新葡京平台游戏 11

![Snip20160327_2.png]()

//cell的最小行间距

  • (CGFloat)collectionView:(UICollectionView )collectionView layout:(UICollectionViewLayout)collectionViewLayout minimumLineSpacingForSectionAtIndex:(NSInteger)section;

//cell的最小列间距

  • (CGFloat)collectionView:(UICollectionView )collectionView layout:(UICollectionViewLayout)collectionViewLayout minimumInteritemSpacingForSectionAtIndex:(NSInteger)section;

//cell被选择时被调用

  • (void)collectionView:(UICollectionView *)collectionView didSelectItemAtIndexPath:(NSIndexPath *)indexPath;

//cell反选时被调用(多选时才生效)

  • (void)collectionView:(UICollectionView *)collectionView didDeselectItemAtIndexPath:(NSIndexPath *)indexPath;

本文由新葡京8455发布,转载请注明来源

关键词: