iOS流布局UICollectionView系列一——初识与简单使用UICollectionView(一)

简介: iOS流布局UICollectionView系列一——初识与简单使用UICollectionView

iOS流布局UICollectionView系列一——初识与简单使用UICollectionView


一、简介


       UICollectionView是iOS6之后引入的一个新的UI控件,它和UITableView有着诸多的相似之处,其中许多代理方法都十分类似。简单来说,UICollectionView是比UITbleView更加强大的一个UI控件,有如下几个方面:


1、支持水平和垂直两种方向的布局


2、通过layout配置方式进行布局


3、类似于TableView中的cell特性外,CollectionView中的Item大小和位置可以自由定义


4、通过layout布局回调的代理方法,可以动态的定制每个item的大小和collection的大体布局属性


5、更加强大一点,完全自定义一套layout布局方案,可以实现意想不到的效果


这篇博客,我们主要讨论CollectionView使用原生layout的方法和相关属性,其他特点和更强的制定化,会在后面的博客中介绍



二、先来实现一个最简单的九宫格类布局


       在了解UICollectionView的更多属性前,我们先来使用其进行一个最简单的流布局试试看,在controller的viewDidLoad中添加如下代码:


   //创建一个layout布局类

   UICollectionViewFlowLayout * layout = [[UICollectionViewFlowLayout alloc]init];

   //设置布局方向为垂直流布局

   layout.scrollDirection = UICollectionViewScrollDirectionVertical;

   //设置每个item的大小为100*100

   layout.itemSize = CGSizeMake(100, 100);

   //创建collectionView 通过一个布局策略layout来创建

   UICollectionView * collect = [[UICollectionView alloc]initWithFrame:self.view.frame collectionViewLayout:layout];

   //代理设置

   collect.delegate=self;

   collect.dataSource=self;

   //注册item类型 这里使用系统的类型

   [collect registerClass:[UICollectionViewCell class] forCellWithReuseIdentifier:@"cellid"];

 

   [self.view addSubview:collect];

这里有一点需要注意,collectionView在完成代理回调前,必须注册一个cell,类似如下:


[collect registerClass:[UICollectionViewCell class] forCellWithReuseIdentifier:@"cellid"];

这和tableView有些类似,又有些不同,因为tableView除了注册cell的方法外,还可以通过临时创建来做:


//tableView在从复用池中取cell的时候,有如下两种方法

//使用这种方式如果复用池中无,是可以返回nil的,我们在临时创建即可

- (nullable __kindof UITableViewCell *)dequeueReusableCellWithIdentifier:(NSString *)identifier;

//6.0后使用如下的方法直接从注册的cell类获取创建,如果没有注册 会崩溃

- (__kindof UITableViewCell *)dequeueReusableCellWithIdentifier:(NSString *)identifier forIndexPath:(NSIndexPath *)indexPath NS_AVAILABLE_IOS(6_0);

我们可以分析:因为UICollectionView是iOS6.0之前的新类,因此这里统一了从复用池中获取cell的方法,没有再提供可以返回nil的方式,并且在UICollectionView的回调代理中,只能使用从复用池中获取cell的方式进行cell的返回,其他方式会崩溃,例如:


//这是正确的方法

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

   UICollectionViewCell * cell  = [collectionView dequeueReusableCellWithReuseIdentifier:@"cellid" forIndexPath:indexPath];

   cell.backgroundColor = [UIColor colorWithRed:arc4random()%255/255.0 green:arc4random()%255/255.0 blue:arc4random()%255/255.0 alpha:1];

   return cell;

}


//这样做会崩溃

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

//    UICollectionViewCell * cell  = [collectionView dequeueReusableCellWithReuseIdentifier:@"cellid" forIndexPath:indexPath];

//    cell.backgroundColor = [UIColor colorWithRed:arc4random()%255/255.0 green:arc4random()%255/255.0 blue:arc4random()%255/255.0 alpha:1];

   UICollectionViewCell * cell = [[UICollectionViewCell alloc]init];

   return cell;

}

上面错误的方式会崩溃,信息如下,让我们使用从复用池中取cell的方式:


image.png


上面的设置完成后,我们来实现如下几个代理方法:


这里与TableView的回调方式十分类似


//返回分区个数

-(NSInteger)numberOfSectionsInCollectionView:(UICollectionView *)collectionView{

   return 1;

}

//返回每个分区的item个数

-(NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section{

   return 10;

}

//返回每个item

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

   UICollectionViewCell * cell  = [collectionView dequeueReusableCellWithReuseIdentifier:@"cellid" forIndexPath:indexPath];

   cell.backgroundColor = [UIColor colorWithRed:arc4random()%255/255.0 green:arc4random()%255/255.0 blue:arc4random()%255/255.0 alpha:1];

   return cell;

}

效果如下:


image.png


同样,如果内容的大小超出一屏,和tableView类似是可以进行视图滑动的。


还有一点细节,我们在上面设置布局方式的时候设置了垂直布局:


layout.scrollDirection = UICollectionViewScrollDirectionVertical;

//这个是水平布局

//layout.scrollDirection = UICollectionViewScrollDirectionHorizontal;

这样系统会在一行充满后进行第二行的排列,如果设置为水平布局,则会在一列充满后,进行第二列的布局,这种方式也被称为流式布局



目录
相关文章
|
程序员 iOS开发 开发者
iOS开发:设置UICollectionView不同大小的item的方法
在iOS开发过程中,UICollectionView的使用作为iOS开发者来说都不陌生,但是要想完美的玩转UICollectionView的所有使用的技巧,还是需要了解很多的。本篇博文来分享一下关于UICollectionView设置不同大小item的方法,为的是迎合产品的需求,方便记录为了以后查看使用,分享给有需要的人。
520 0
iOS开发:设置UICollectionView不同大小的item的方法
|
iOS开发
iOS开发UI篇 - Quartz 2D简单使用
iOS开发UI篇 - Quartz 2D简单使用
iOS开发UI篇 - Quartz 2D简单使用
|
iOS开发
iOS UICollectionView 从右向左对齐的实现
iOS UICollectionView 从右向左对齐的实现
507 0
iOS UICollectionView 从右向左对齐的实现
|
iOS开发
iOS网络编程之三——NSURLConnection的简单使用
iOS网络编程之三——NSURLConnection的简单使用
147 0
iOS网络编程之三——NSURLConnection的简单使用
|
缓存 iOS开发
iOS网络编程之二——NSURLSession的简单使用
iOS网络编程之二——NSURLSession的简单使用
272 0
|
监控 iOS开发
iOS流布局UICollectionView系列七——三维中的球型布局
iOS流布局UICollectionView系列七——三维中的球型布局
300 0
iOS流布局UICollectionView系列七——三维中的球型布局
|
iOS开发
iOS流布局UICollectionView系列六——将布局从平面应用到空间(二)
iOS流布局UICollectionView系列六——将布局从平面应用到空间
152 0
|
iOS开发 索引
iOS流布局UICollectionView系列六——将布局从平面应用到空间
iOS流布局UICollectionView系列六——将布局从平面应用到空间
267 0
iOS流布局UICollectionView系列六——将布局从平面应用到空间
|
存储 iOS开发
iOS流布局UICollectionView系列五——圆环布局的实现
iOS流布局UICollectionView系列五——圆环布局的实现
222 0
iOS流布局UICollectionView系列五——圆环布局的实现
|
iOS开发
iOS流布局UICollectionView系列四——自定义FlowLayout进行瀑布流布局(二)
iOS流布局UICollectionView系列四——自定义FlowLayout进行瀑布流布局
186 0