如何创建UICollectionView

集合视图的布局UICollectionViewFlowLayout

自定义cell

布局协议UICollectionViewDelegateFlowLayout

UICollectionView与UITableView的实现类似,都需要设置delegate和dataSource

在collectionView中,cell的布局比tableView要复杂,需要使用一个类来描述集合视图的布局---UICollectionViewLayout->UICollectionViewFlowLayout

创建步骤

1.使用系统布局UICollectionViewFlowLayout

2.创建UICollectionView

3.设置代理,设置数据源

4.设置自定义Cell

数据源

我们需要给collectionView指定一个数据源,它负责给对collectionView提供数据与显示

#import "JYFViewController.h"

#import "Model.h"

#import "MyCell.h"

#import "MyHeader.h"

#import "MyFooter.h"

#import "UIImageView+WebCache.h"

@interface JYFViewController ()<</span>UICollectionViewDataSource,UICollectionViewDelegate, UICollectionViewDelegateFlowLayout>

@property (nonatomic, retain) NSMutableArray *allDataArray;

@end

@implementation JYFViewController

- (void)viewDidLoad

{

[super viewDidLoad];

// 1.获取文件路径

NSString *filePath = [[NSBundle mainBundle] pathForResource:@"Data"ofType:@"json"];

// 2.读取文件数据

NSData *data = [NSData dataWithContentsOfFile:filePath];

// 3.解析数据

NSArray *array = [NSJSONSerialization JSONObjectWithData:dataoptions:NSJSONReadingAllowFragments error:nil];

// 4.遍历放入大数组中

self.allDataArray = [NSMutableArray array];

for (NSDictionary *dict in array) {

Model *model = [Model new];

[model setValuesForKeysWithDictionary:dict];

[_allDataArray addObject:model];

[model release];

NSLog(@"%@", _allDataArray);

}

// 1.创建UICollectionViewFlowLayout

UICollectionViewFlowLayout *flowLayout = [[UICollectionViewFlowLayoutalloc] init];

// 1.1设置每个Item的大小

flowLayout.itemSize = CGSizeMake(90, 210);

// 1.2 设置每列最小间距

flowLayout.minimumInteritemSpacing = 10;

// 1.3设置每行最小间距

flowLayout.minimumLineSpacing = 10;

// 1.4设置滚动方向

flowLayout.scrollDirection = UICollectionViewScrollDirectionVertical;

// 1.5设置header区域大小

flowLayout.headerReferenceSize = CGSizeMake(self.view.bounds.size.width,50);

// 1.6设置footer区域大小

flowLayout.footerReferenceSize = CGSizeMake(self.view.bounds.size.width,50);

// 1.7 设置item内边距大小

flowLayout.sectionInset = UIEdgeInsetsMake(10, 10, 10, 10);

// 2.创建UICollectionView

UICollectionView *collectionView = [[UICollectionView alloc]initWithFrame:self.view.bounds collectionViewLayout:flowLayout];

// 3.设置数据源代理、collection代理

collectionView.dataSource = self;

collectionView.delegate = self;

[self.view addSubview:collectionView];

[collectionView release];

[flowLayout release];

collectionView.backgroundColor = [UIColor colorWithRed:0.895 green:1.000blue:0.656 alpha:1.000];

// 4.注册cell的类型和重用标示符

[collectionView registerClass:[MyCell class] forCellWithReuseIdentifier:@"cell"];

// 5.注册footer和header类型的重用标识符

[collectionView registerClass:[MyHeader class] forSupplementaryViewOfKind:UICollectionElementKindSectionHeader withReuseIdentifier:@"headerView"];

[collectionView registerClass:[MyFooter class] forSupplementaryViewOfKind:UICollectionElementKindSectionFooter

withReuseIdentifier:@"footerView"];

}

#pragma mark - UICollectionViewDataSource Methods

#pragma mark 设置有多少个section

- (NSInteger)numberOfSectionsInCollectionView:(UICollectionView*)collectionView

{

return 5;

}

#pragma mark 设置某个分组有多少行

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

{

return 13;

}

#pragma mark 设置某个Item显示什么内容

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

{

// 1.去重用队列中查找

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

// 2.使用

//    CGFloat red = arc4random()% 256 / 255.0;

//    CGFloat green = arc4random() % 256 / 255.0;

//    CGFloat blue = arc4random() % 256 / 255.0;

//    cell.backgroundColor = [UIColor colorWithRed:red green:green blue:blue alpha:1.0];

cell.label.text = [NSString stringWithFormat:@"s = %ld r =  %ld", indexPath.section, indexPath.row];

// 3.获取将要显示的模型

Model *model = _allDataArray[indexPath.row];

// 4.使用第三方获取图片并自动缓存

NSURL *imageUrl = [NSURL URLWithString:model.thumbURL];

[cell.imageView sd_setImageWithURL:imageUrl placeholderImage:[UIImageimageNamed:@"default_head_image@2x.png"]];

return cell;

}

#pragma mark 处理点击事件

- (void)collectionView:(UICollectionView *)collectionView didSelectItemAtIndexPath:(NSIndexPath *)indexPath

{

NSLog(@"我被点击了");

}

#pragma mark - UICollectionViewDelegateFlowLayout Method

#pragma mark 设置item的大小

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

{

return CGSizeMake(90, 120);

}

#pragma mark 设置footer和header

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

{

if (kind == UICollectionElementKindSectionHeader) {

// 去重用队列取可用的header

MyHeader *reusableView = [collectionView dequeueReusableSupplementaryViewOfKind:kind withReuseIdentifier:@"headerView"forIndexPath:indexPath];

// 使用

reusableView.headerImage.image = [UIImage imageNamed:@"屏幕快照 2014-0 9.30.50 9-11 上午.png"];

// 返回

return reusableView;

}else{

// 去重用队列取可用的footer

MyFooter *reusableView = [collectionView dequeueReusableSupplementaryViewOfKind:kind withReuseIdentifier:@"footerView"forIndexPath:indexPath];

// 使用

reusableView.backgroundColor = [UIColor redColor];

// 返回

return reusableView;

}

}

#pragma mark 设置header和footer高度

- (CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout *)collectionViewLayout referenceSizeForHeaderInSection:(NSInteger)section

{

return CGSizeMake(self.view.bounds.size.width, 70);

}

- (CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout *)collectionViewLayout referenceSizeForFooterInSection:(NSInteger)section

{

return CGSizeMake(self.view.bounds.size.width, 70);

}

- (void)didReceiveMemoryWarning

{

[super didReceiveMemoryWarning];

// Dispose of any resources that can be recreated.

}

- (void)dealloc

{

[_allDataArray release];

[super dealloc];

}

@end

总结:

集合视图UICollectionView和表示图UITableView很相似,可根据layout属性设置,显示单元格集合内容

UICollectionViewDataSource类作为集合视图的数据源,向集合视图提供数据。集合视图依赖于委托(Delegate)中定义的方法对用户进行响应

UICollectionView集合视图的概念的更多相关文章

  1. UICollectionView 集合视图用法,自定义Cell

    在View里面 //1.创建UICollectionViewFlowLayout UICollectionViewFlowLayout *flowLayout=[[UICollectionViewFl ...

  2. UICollectionView 集合视图 的使用

    直接上代码: // // RootViewController.m // // #import "RootViewController.h" #import "Colle ...

  3. UICollectionView(集合视图)以及自定义集合视图

    一.UICollectionView集合视图           其继承自UIScrollView.         UICollectionView类是iOS6新引进的API,用于展示集合视图,布局 ...

  4. iOS:集合视图UICollectionView、集合视图控制器UICollectionViewController、集合视图单元格UICollectionViewCell(创建表格的另一种控件)

    两种创建表格方式的比较:表格视图.集合视图(二者十分类似) <1>相同点:   表格视图:UITableView(位于storyboard中,通过UIViewController控制器实现 ...

  5. 集合视图UICollectionView 介绍及其示例程序

    UICollectionView是一种新的数据展示方式,简单来说可以把它理解成多列的UITableView.如果你用过iBooks的话,可 能你还对书架布局有一定印象,一个虚拟书架上放着你下载和购买的 ...

  6. swift:创建集合视图UICollectionView

    swift中创建集合视图和OC中差不多,主要是实现UICollectionViewDataSource数据源协议和UICollectionViewDelegateFlowLayout自定义布局协议,其 ...

  7. 【推荐】iOS集合视图的可重新排序的layout

    在实际项目中你或许会遇到在一个集合视图中移动一项到另外一个位置,那么此时我们需要对视图中的元素进行重新排序,今天推荐一个很好用的第三方类LXReorderableCollectionViewFlowL ...

  8. 集合视图控制器(CollectionViewController) 、 标签控制器(TabBarController) 、 高级控件介绍

    1 创建集合视图,设置相关属性以满足要求 1.1 问题 集合视图控制器UIConllectionViewController是一个展示大量数据的控制器,系统默认管理着一个集合视图UICollectio ...

  9. 理解 UWP 视图的概念,让 UWP 应用显示多个窗口(多视图)

    原文 理解 UWP 视图的概念,让 UWP 应用显示多个窗口(多视图) UWP 应用多是一个窗口完成所有业务的,事实上我也推荐使用这种单一窗口的方式.不过,总有一些特别的情况下我们需要用到不止一个窗口 ...

随机推荐

  1. AngularJS讲义-控制器

    在Angular中,控制器(Controller)就是基于JavaScript的构造方法,主要用来构造模型并建立模型和视图之间的数据绑定.控制器里面定义了应用程序的逻辑和行为. 通过ng-contro ...

  2. .NET NLog 详解 (三) - LayoutRender

    这期将NLog Git版本指向2005-06-09,NLog v0.9 released.这个时候的代码结构升级为这样: 和上期的版本相比,最明显的莫过于原先的Appender全套更名为Target. ...

  3. C# 重绘tabControl,添加关闭按钮(续)

    在上一篇随笔中,添加关闭按钮是可以实现 ,但细心一点就会发现,每次关闭一个选项卡,tableControl都会自动跳到第一个页面,显然 这不是我们想要的,为此,我修改了部分的代码.除此之外,我还添加了 ...

  4. hdu 5291 dp+优化 ****

    多校实在高能 题解链接 题意:有n中糖果,每种糖果有ai个.分给A,B两个人.两人的糖果要一样多,可以都是0,1......m个.同一种糖果没有区别. 问有几种分法. 定义dp[i]表示两人之间相差i ...

  5. hdu 4043 2011北京赛区网络赛D 概率+大数 **

    推出公式为:P = A(2n,n)/(2^(2n)*n!) 但是不会大数,学完java再补

  6. 在ASP.NET 5中使用SignalR

    (此文章同时发表在本人微信公众号"dotNET每日精华文章",欢迎右边二维码来关注.) 题记:SignalR作为ASP.NET中进行Web实时双向通信的组件,在ASP.NET 5中 ...

  7. 趣味算法:字符串反转的N种方法(转)

    老赵在反对北大青鸟的随笔中提到了数组反转.这的确是一道非常基础的算法题,然而也是一道很不平常的算法题(也许所有的算法深究下去都会很不平常).因为我写着写着,就写出来8种方法……现在我们以字符串的反转为 ...

  8. connot resolve symbol R

    出现这个原因大都是layout里的xml文件出错,就不会自动生成R文件

  9. Redis的几个认识误区

    此文作者是新浪微博平台架构师杨卫华timyang大师,是他对Redis研究的一个总结,澄清了一些认识上的误区,值得一读. James Hamilton在On Designing and Deployi ...

  10. MVVM模式下实现拖拽

    在文章开始之前先看一看效果图 我们可以拖拽一个"游戏"给ListBox,并且ListBox也能接受拖拽过来的数据, 但是我们不能拖拽一个"游戏类型"给它. 所以 ...