本章通过先总体介绍UICollectionView及其常用方法,再结合一个实例,了解如何使用UICollectionView。

 

UICollectionView 和 UICollectionViewController 类是iOS6 新引进的API,用于展示集合视图,布局更加灵活,可实现多列布局,用法类似于UITableView 和 UITableViewController 类。

使用UICollectionView 必须实现UICollectionViewDataSource,UICollectionViewDelegate,UICollectionViewDelegateFlowLayout这三个协议。

 

下面先给出常用到的一些方法。(只给出常用的,其他的可以查看相关API) 

1. #pragma mark -- UICollectionViewDataSource   
 
1. //定义展示的UICollectionViewCell的个数  
2. -(NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section  
3. {  
4. return 30;  
5. }   
 
1. //定义展示的Section的个数  
2. -(NSInteger)numberOfSectionsInCollectionView:(UICollectionView *)collectionView  
3. {  
4. return 1;  
5. }   
 
1. //每个UICollectionView展示的内容  
2. -(UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath  
3. {  
4. static NSString * CellIdentifier = @"GradientCell";  
5.     UICollectionViewCell * cell = [collectionView dequeueReusableCellWithReuseIdentifier:CellIdentifier forIndexPath:indexPath];  
6.   
7.     cell.backgroundColor = [UIColor colorWithRed:((10 * indexPath.row) / 255.0) green:((20 * indexPath.row)/255.0) blue:((30 * indexPath.row)/255.0) alpha:1.0f];  
8. return cell;  
9. }   
 
1. #pragma mark --UICollectionViewDelegateFlowLayout   
 
1. //定义每个UICollectionView 的大小  
2. - (CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout*)collectionViewLayout sizeForItemAtIndexPath:(NSIndexPath *)indexPath  
3. {  
4. return CGSizeMake(96, 100);  
5. }   
 
1. //定义每个UICollectionView 的 margin  
2. -(UIEdgeInsets)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout *)collectionViewLayout insetForSectionAtIndex:(NSInteger)section  
3. {  
4. return UIEdgeInsetsMake(5, 5, 5, 5);  
5. }   
 
1. #pragma mark --UICollectionViewDelegate   
 
1. //UICollectionView被选中时调用的方法  
2. -(void)collectionView:(UICollectionView *)collectionView didSelectItemAtIndexPath:(NSIndexPath *)indexPath  
3. {  
4.     UICollectionViewCell * cell = (UICollectionViewCell *)[collectionView cellForItemAtIndexPath:indexPath];  
5.     cell.backgroundColor = [UIColor whiteColor];  
6. }   
 
1. //返回这个UICollectionView是否可以被选择  
2. -(BOOL)collectionView:(UICollectionView *)collectionView shouldSelectItemAtIndexPath:(NSIndexPath *)indexPath  
3. {  
4. return YES;  
5. }

 

下面通过一个例子具体介绍下。(例子来自网络。但是是通过第三方获得的,无法取得链接。还望见谅。)

 

iOS CollectionView的出现是一大福利,再也不用用TableView来定义复杂的多栏表格了,用法与Table类似,只是Cell必须自己添加,无默认模式

由于CollectionView没有默认的Cell布局,所以一般还是自定义方便又快捷

一、自定义Cell

1、新建类CollectionCell继承自UICollectionViewCell

ios collectionview设置上下排列 ios uicollectionview_UICollectionView

2、新建Xib,命名为CollectionCell.xib

设置大小为95*116;

ios collectionview设置上下排列 ios uicollectionview_#pragma_02

 

b.选中刚刚添加的Cell,更改类名为CollectionCell,如图4

ios collectionview设置上下排列 ios uicollectionview_UICollectionView_03

c.在CollectionCell.xib的CollectionCell中添加一个ImageView和一个Label(图5)

ios collectionview设置上下排列 ios uicollectionview_ide_04

d.创建映射, 图6,图7

ios collectionview设置上下排列 ios uicollectionview_ide_05

ios collectionview设置上下排列 ios uicollectionview_UICollectionView_06

 

1. - (id)initWithFrame:(CGRect)frame  
2. {  
3.     self = [super initWithFrame:frame];  
4. if (self)  
5.     {  
6. // 初始化时加载collectionCell.xib文件  
7. "CollectionCell" owner:self options:nil];  
8.           
9. // 如果路径不存在,return nil  
10. if (arrayOfViews.count < 1)  
11.         {  
12. return nil;  
13.         }  
14. // 如果xib中view不属于UICollectionViewCell类,return nil  
15. if (![[arrayOfViews objectAtIndex:0] isKindOfClass:[UICollectionViewCell class]])  
16.         {  
17. return nil;  
18.         }  
19. // 加载nib  
20.         self = [arrayOfViews objectAtIndex:0];  
21.     }  
22. return self;  
23. }  
 
 
f.选中CollectionCell.xib 修改其identifier为CollectionCell。 
二、定义UICollectionView; 1、拖动一个Collection View到指定ViewController的View上
 2、连线dataSource和delegate,并创建映射,命名为CollectionView
 3、选中CollectionView的标尺,将Cell Size的Width和Height改成与自定义的Cell一样的95*116,图8
     
 4、选中CollectionView的属性,可以修改其属性,比如是垂直滑动,还是水平滑动,选择Vertical或Horizontal
 5、选中CollectionViewCell,修改Class,继承自CollectionCell
 
 5、在ViewDidLoad方法中声明Cell的类,在ViewDidLoad方法中添加,此句不声明,将无法加载,程序崩溃
 
 
1. [self.collectionView registerClass:[CollectionCell class] forCellWithReuseIdentifier:@"CollectionCell"];  
 
 
6、在ViewController.h中声明代理  
1. @interface ViewController : UIViewController<UICollectionViewDataSource,UICollectionViewDelegate>  
 
 
  
7、在.m文件中实现代理方法 
 
1. //每个section的item个数  
2. -(NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section  
3. {  
4. return 12;  
5. }  
6.   
7. -(UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath  
8. {  
9.       
10. "CollectionCell" forIndexPath:indexPath];  
11.       
12. //图片名称  
13. "%d.png", indexPath.row];  
14. //加载图片  
15.     cell.imageView.image = [UIImage imageNamed:imageToLoad];  
16. //设置label文字  
17. "{%ld,%ld}",(long)indexPath.row,(long)indexPath.section];  
18.       
19. return cell;  
20. }

1)  必须使用下面的方法进行Cell类的注册:
   //    - (void)registerClass:forCellWithReuseIdentifier:
   //    - (void)registerClass:forSupplementaryViewOfKind:withReuseIdentifier:
   //    - (void)registerNib:forCellWithReuseIdentifier:
   //    - (void)registerNib:forSupplementaryViewOfKind:withReuseIdentifier:
   //初始化
   UICollectionViewFlowLayout *flowLayout=[[UICollectionViewFlowLayout alloc] init];
   setScrollDirection:UICollectionViewScrollDirectionVertical];
   self.collectionView = [[UICollectionViewalloc]initWithFrame:CGRectMake(0, kNavHeight, kDeviceWidth,kDeviceHeight-kNavHeight*2-kTabBarHeight-20)collectionViewLayout:flowLayout];
   //注册
  self.collectionView registerClass:[VideoCell class]forCellWithReuseIdentifier:@"cell"];
 //设置代理
   self.collectionView.delegate = self;
   self.collectionView.dataSource = self;
  self.view addSubview:self.collectionView];



 #pragma mark - collectionView delegate
//设置分区
NSInteger)numberOfSectionsInCollectionView:(UICollectionView
   
   return 1;
 }
 
//每个分区上的元素个数
NSInteger)collectionView:(UICollectionView*)collectionView numberOfItemsInSection:(NSInteger)section
 {
   return 24;
 }
 
//设置元素内容
UICollectionViewCell *)collectionView:(UICollectionView*)collectionView cellForItemAtIndexPath:(NSIndexPath*)indexPath
 {
   static NSString *identify = @"cell";
   VideoCell *cell = [collectionViewdequeueReusableCellWithReuseIdentifier:identifyforIndexPath:indexPath];
   [cell sizeToFit];
   if
       
  
   VideoModel *model = [self.videoModelsobjectAtIndex:indexPath.row];
   NSURL *url = [NSURL URLWithString:model.videoImgURL];
   
   [cell.imgView setImageWithURL:url];
   cell.titleLbale.text = model.videoTitle;
   return
 }
 
//设置元素的的大小框
UIEdgeInsets)collectionView:(UICollectionView*)collectionView layout:(UICollectionViewLayout*)collectionViewLayout insetForSectionAtIndex:(NSInteger)section
 {
   UIEdgeInsets top = {5,10,15,5};
   return
 }
 
//设置顶部的大小
CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout *)collectionViewLayout referenceSizeForHeaderInSection:(NSInteger)section{
   CGSize size={0,0};
   return
 }
//设置元素大小
CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout *)collectionViewLayout sizeForItemAtIndexPath:(NSIndexPath
   
  
   return CGSizeMake(240,(kDeviceHeight-kNavHeight*2-kTabBarHeight-20)/4.0);
 }
 
//点击元素触发事件
void)collectionView:(UICollectionView *)collectionView didSelectItemAtIndexPath:(NSIndexPath
   NSLog(@"%@",indexPath);
   DetailVideoViewController *detailVC = [[DetailVideoViewController alloc]init];
  self.navigationController pushViewController:detailVCanimated:YES];
   [detailVC release];
 }