本章通过先总体介绍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
2、新建Xib,命名为CollectionCell.xib
设置大小为95*116;
b.选中刚刚添加的Cell,更改类名为CollectionCell,如图4
c.在CollectionCell.xib的CollectionCell中添加一个ImageView和一个Label(图5)
d.创建映射, 图6,图7
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];
}