iOS中 UICollectionView UI_19
UICollectionView 是UITableView加强版
UITableView 和UICollectionView的设计思想:
1.布局:
UITableView 的布局可以由UITableView本身和UITableViewDelegate完成
UICollectionView的布局由UICollectionLayout的子类UICollectionFlowLayout和UICollectionLayoutDelegate完成
2.布局样式
UITableView单列多行
UICollectionView支持多行多列
3.数据源:
UITableView的数据源是UITableViewDataSource
UICollectionView的数据源是UICollectionViewDataSource
4.cell的样式
UITableViewCell 系统提供的有四种样式
UICollectionViewCell 只自带contentView,但是contentView什么也没有,所有你要显示图片,文字必须要自定义cell
5.cell的重用
UITableViewCell 和 UICollectionCell 都可以重用;先注册后重用
6.页眉页脚
UITableView 的页眉页脚不可以重用,但是 UICollectionView的页眉页脚是可以重用的
7.编辑
UITableView 支持编辑,添加、删除和移动
UICollectionView 不支持编辑
8.父类
UITableView 和 UICollectionView 的父类都是UIScrollView
但是UITableView 只能竖直方向滚动,而UICollectionView支持竖直方向和水平方向滚动
——————————————————————————————————————————
AppDelegate.m
self.window.rootViewController = [[[UINavigationController alloc]initWithRootViewController:[RootViewController new]]autorelease];
=======================UICollectionView系统自带的cell============================
RootViewController.m
#import "RootViewController.h" #import "DetailViewController.h" #define kItem @"item" #define kHead @"heaad" #define kFooter @"footer" @interface RootViewController ()<UICollectionViewDataSource,UICollectionViewDelegate,UICollectionViewDelegateFlowLayout>//遵循协议 @end
- (void)viewDidLoad {
[super viewDidLoad];
self.title = @"集合视图";
self.view.backgroundColor = [UIColor whiteColor];
//调用CollectionView的布局方法
[self configureCollectionView];
}
CollectionView的布局方法:
- (void)configureCollectionView{
// UICollectionViewLayout 是所有布局类的基类,是一个抽象的类,一般很少直接使用基类(不是视图),都是使用基类的子类,所有 UICollectionView 的布局我们要使用 UICollectionViewFlowLayout 完成
UICollectionViewFlowLayout *flowLayout = [[UICollectionViewFlowLayout alloc]init];
//1.设置Item的大小
flowLayout.itemSize = CGSizeMake(130, 150);
//2.设置Item的缩进量
flowLayout.sectionInset = UIEdgeInsetsMake(5, 10, 5, 10);
//3.设置最小行间距
flowLayout.minimumLineSpacing = 20.0;
//4.设置Item列间距
flowLayout.minimumInteritemSpacing = 20.0;
//5.设置CollectionView滚动方向
// flowLayout.scrollDirection = UICollectionViewScrollDirectionHorizontal; //水平滚动
// flowLayout.scrollDirection = UICollectionViewScrollDirectionVertical; //默认竖直方向滚动
//6.设置页眉的大小
flowLayout.headerReferenceSize = CGSizeMake(320, 40);
//7.设置页脚的大小
flowLayout.footerReferenceSize = CGSizeMake(320, 40);
//创建一个UICollectionView对象
UICollectionView *collectionView = [[UICollectionView alloc]initWithFrame:[UIScreen mainScreen].bounds collectionViewLayout:flowLayout];
//配置collectionView的背景颜色
collectionView.backgroundColor = [UIColor greenColor];
//指定数据源代理
collectionView.dataSource = self;
//注册Cell
[collectionView registerClass:[UICollectionViewCell class] forCellWithReuseIdentifier:kItem];
//注册页眉和页脚
//第一个参数:重用视图的类
//第二个参数:重用是页眉和页脚的种类
//第三个参数:重用的标识
[collectionView registerClass:[UICollectionReusableView class] forSupplementaryViewOfKind:UICollectionElementKindSectionHeader withReuseIdentifier:kHead];
//注册页脚
[collectionView registerClass:[UICollectionReusableView class] forSupplementaryViewOfKind:UICollectionElementKindSectionFooter withReuseIdentifier:kFooter];
//设置业务代理
collectionView.delegate = self;
//将collectionView添加到视图控制器上
[self.view addSubview:collectionView];
[flowLayout release];
[collectionView release];
}
#pragma mark CollectionView 的数据源代理方法
//返回每个分区Item的个数
- (NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section{
return 20;
}
//根据indexPath 返回cell
- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath{
UICollectionViewCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:kItem forIndexPath:indexPath];
//设置cell的颜色
cell.backgroundColor = [UIColor redColor];
NSLog(@"%@",NSStringFromCGRect(cell.frame));
return cell;
}
//返回collectionView分区的个数
- (NSInteger)numberOfSectionsInCollectionView:(UICollectionView *)collectionView{
return 2;
}
//返回重用的页眉页脚的方法
- (UICollectionReusableView *)collectionView:(UICollectionView *)collectionView viewForSupplementaryElementOfKind:(NSString *)kind atIndexPath:(NSIndexPath *)indexPath{
UICollectionReusableView *view = nil;
//根据种类判断要使用页眉还是页脚
if ([kind isEqualToString:UICollectionElementKindSectionHeader]) {
//重用页眉
view = [collectionView dequeueReusableSupplementaryViewOfKind:UICollectionElementKindSectionHeader withReuseIdentifier:kHead forIndexPath:indexPath];
//设置页眉的颜色
view.backgroundColor = [UIColor orangeColor];
}else{
//重用页脚
view = [collectionView dequeueReusableSupplementaryViewOfKind:UICollectionElementKindSectionFooter withReuseIdentifier:kFooter forIndexPath:indexPath];
//设置页脚颜色
view.backgroundColor = [UIColor blackColor];
}
return view;
}
#pragma mark CollectionView 的业务代理方法:
- (void)collectionView:(UICollectionView *)collectionView didSelectItemAtIndexPath:(NSIndexPath *)indexPath{
//打印item的分区下标和item下标
NSLog( @"%ld--%ld",indexPath.section,indexPath.item);
[self.navigationController pushViewController:[DetailViewController new] animated:YES];
}
#pragma mark UICollectionViewFlowLayoutDelegate 的方法
- (CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout*)collectionViewLayout sizeForItemAtIndexPath:(NSIndexPath *)indexPath{
if (0 == indexPath.section % 2) {
return CGSizeMake(50, 50);
}else{
return CGSizeMake(130,130);
}
}
//返回分区缩进量
- (UIEdgeInsets)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout*)collectionViewLayout insetForSectionAtIndex:(NSInteger)section{
if (0 == section % 2) {
return UIEdgeInsetsMake(10, 10, 10, 10);
}else{
return UIEdgeInsetsMake(20, 20, 20, 20);
}
}
//返回每一行item之间的最小间距
- (CGFloat)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout*)collectionViewLayout minimumLineSpacingForSectionAtIndex:(NSInteger)section{
return 30;
}
//返回item之间的最小列间距
- (CGFloat)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout*)collectionViewLayout minimumInteritemSpacingForSectionAtIndex:(NSInteger)section{
return 20;
}
//返回页眉的大小
- (CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout*)collectionViewLayout referenceSizeForHeaderInSection:(NSInteger)section{
return CGSizeMake(320,100);
}
//返回页脚的大小
- (CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout*)collectionViewLayout referenceSizeForFooterInSection:(NSInteger)section{
return CGSizeMake(320, 100);
}
===========================学习自定义的cell==================================
新建一个页面在这里学习自定义cell、自定义页眉和页脚:
DetailViewController.m
#import "NBViewCell.h" #import "HeaderView.h" #import "FooterView.h" #define kNBcell @"nb-cell" #define kHeadView @"head" #define kFootView @"foot" @interface DetailViewController ()<UICollectionViewDataSource>//遵循协议 @end
- (void)viewDidLoad {
[super viewDidLoad];
self.view.backgroundColor = [UIColor orangeColor];
//调用配置CollectionView
[self configureCollectionView];
}
配置CollectionView:
//配置CollectionView
- (void)configureCollectionView{
//创建布局类
UICollectionViewFlowLayout *flowout = [[UICollectionViewFlowLayout alloc]init];
//设置item的大小
flowout.itemSize = CGSizeMake(90, 90);
//设置页眉的大小
flowout.headerReferenceSize =CGSizeMake(320, 100);
//设置页脚的大小
flowout.footerReferenceSize = CGSizeMake(320, 80);
//设置分区缩进量
flowout.sectionInset = UIEdgeInsetsMake(5, 5, 5, 5);
//创建CollectionView对象
UICollectionView *collectionView = [[UICollectionView alloc]initWithFrame:[UIScreen mainScreen].bounds collectionViewLayout:flowout];
//配置数据源代理
collectionView.dataSource = self;
//注册cell
[collectionView registerClass:[NBViewCell class] forCellWithReuseIdentifier:kNBcell];
//注册页眉
[collectionView registerClass:[HeaderView class] forSupplementaryViewOfKind:UICollectionElementKindSectionHeader withReuseIdentifier:kHeadView];
//注册页脚
[collectionView registerClass:[FooterView class] forSupplementaryViewOfKind:UICollectionElementKindSectionFooter withReuseIdentifier:kFootView];
//配置背景颜色
collectionView.backgroundColor = [UIColor whiteColor];
//添加到父视图
[self.view addSubview:collectionView];
[collectionView release];
[flowout release];
}
#pragma mark 数据源代理方法:
- (NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section{
return 100;
}
//
- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath{
NBViewCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:kNBcell forIndexPath:indexPath];
cell.label.text = [NSString stringWithFormat:@"%ld--%ld",indexPath.section,indexPath.item];
return cell;
}
- (NSInteger)numberOfSectionsInCollectionView:(UICollectionView *)collectionView{
return 2;
}
- (UICollectionReusableView *)collectionView:(UICollectionView *)collectionView viewForSupplementaryElementOfKind:(NSString *)kind atIndexPath:(NSIndexPath *)indexPath{
//重用页眉
if ([kind isEqualToString:UICollectionElementKindSectionHeader]) {
HeaderView *view = [collectionView dequeueReusableSupplementaryViewOfKind:UICollectionElementKindSectionHeader withReuseIdentifier:kHeadView forIndexPath:indexPath];
view.photoView.image = [UIImage imageNamed:@"2"];
return view;
}else{
//重用页脚
FooterView *view = [collectionView dequeueReusableSupplementaryViewOfKind:UICollectionElementKindSectionFooter withReuseIdentifier:kFootView forIndexPath:indexPath];
view.footerLabel.text = [NSString stringWithFormat:@"第%ld个分区",indexPath.section];
return view;
}
}
准备一个自定义cell:
NBViewCell.h
@interface NBViewCell : UICollectionViewCell @property(nonatomic,retain)UILabel *label; @end
NBViewCell.m
@implementation NBViewCell
- (void)dealloc
{
self.label = nil;
[super dealloc ];
}
//重写初始化方法
- (id)initWithFrame:(CGRect)frame{
if (self = [super initWithFrame:frame]) {
[self.contentView addSubview:self.label];
}
return self;
}
- (UILabel *)label{
if (_label == nil) {
self.label = [[UILabel alloc]initWithFrame:self.bounds];
self.label.textAlignment = NSTextAlignmentCenter;
self.label.backgroundColor = [UIColor cyanColor];
}
return [[_label retain]autorelease];
}
@end
准备一个自定义页眉:
实现页眉显示图片
HeaderView.h
@interface HeaderView : UICollectionReusableView @property(nonatomic,retain)UIImageView *photoView; @end
HeaderView.m
@implementation HeaderView
- (void)dealloc
{
self.photoView = nil;
[super dealloc];
}
- (instancetype)initWithFrame:(CGRect)frame{
if (self = [super initWithFrame:frame]) {
[self addSubview:self.photoView];
}
return self;
}
- (UIImageView *)photoView{
if (_photoView == nil) {
self.photoView = [[UIImageView alloc]initWithFrame:self.bounds];
// self.photoView.image = [UIImage imageNamed:@"a.jpg"];
self.photoView.backgroundColor = [UIColor yellowColor];
}
return [[_photoView retain]autorelease];
}
@end
准备一个自定义页脚:
实现页脚显示分区
FooterView.h
@interface FooterView : UICollectionReusableView @property(nonatomic,retain)UILabel *footerLabel; @end
FooterView.m
@implementation FooterView
- (void)dealloc
{
self.footerLabel = nil;
[super dealloc];
}
- (instancetype)initWithFrame:(CGRect)frame{
if (self = [super initWithFrame:frame]) {
[self addSubview:self.footerLabel];
}
return self;
}
- (UILabel *)footerLabel{
if (_footerLabel == nil) {
self.footerLabel = [[UILabel alloc]initWithFrame:self.bounds];
self.footerLabel.backgroundColor = [UIColor redColor];
}
return [[_footerLabel retain]autorelease];
}
@end
页眉图片:
最终效果:
---------------------------------------------
iOS中 UICollectionView UI_19的更多相关文章
- IOS中UICollectionView和UICollectionViewController的用法
1.新建一个xib描述UICollectionViewCell(比如DealCell.xib),设置好resuse identifier(比如deal) 2.控制器继承UICollectionView ...
- iOS中UICollectionView添加头视图
参考链接:https://www.jianshu.com/p/ef57199bf34a 找了一堆的博客,写的都少了很重要的一步. //引入头部视图 -(UICollectionReusableView ...
- iOS 中UICollectionView实现各种视觉效果
参考链接:https://www.jianshu.com/p/b3322f41e84c 基础:https://www.jianshu.com/p/d0b034f59020
- iOS流布局UICollectionView系列七——三维中的球型布局
摘要: 类似标签云的球状布局,也类似与魔方的3D布局 iOS流布局UICollectionView系列七——三维中的球型布局 一.引言 通过6篇的博客,从平面上最简单的规则摆放的布局,到不规则的瀑 ...
- iOS开发——高级篇——iOS中常见的设计模式(MVC/单例/委托/观察者)
关于设计模式这个问题,在网上也找过一些资料,下面是我自己总结的,分享给大家 如果你刚接触设计模式,我们有好消息告诉你!首先,多亏了Cocoa的构建方式,你已经使用了许多的设计模式以及被鼓励的最佳实践. ...
- iOS 中有用的开源库
youtube下载神器:https://github.com/rg3/youtube-dl vim插件:https://github.com/Valloric/YouCompleteMe vim插件配 ...
- ios 中的小技巧 - 总有你想要的 一
UITableView的Group样式下顶部空白处理 在viewWillAppear里面添加如下代码: //分组列表头部空白处理 CGRect frame = myTableView.tableHea ...
- iOS:UICollectionView的扩展应用
一.介绍 CollectionView是iOS中一个非常重要的控件,它可以实现很多的炫酷的效果,例如轮播图.瀑布流.相册浏览等.其实它和TableView很相似,都是对cell进行复用,提高系统性能. ...
- iOS中常见的设计模式(MVC/单例/委托/观察者)
关于设计模式这个问题,在网上也找过一些资料,下面是我自己总结的,分享给大家 如果你刚接触设计模式,我们有好消息告诉你!首先,多亏了Cocoa的构建方式,你已经使用了许多的设计模式以及被鼓励的最佳实践. ...
随机推荐
- monitoring with Prometheus
Prometheus是一款开源的监控工具,支持k8s metrics的数据格式,同时也支持通过k8s api进行服务发现从而实现对自定义的metrics进行监控.下面通过一个示例来介绍如何将Prome ...
- OpenCV设置摄像头分辨率及全屏显示
OpenCV3.0下 设置摄像头分辨率为1920*1440,并全屏显示图像窗口. int _tmain(int argc, _TCHAR* argv[]) { Mat frame; VideoCapt ...
- JUnit单元测试教程(翻译自Java Code Geeks)
JUnit单元测试教程--终极指南 JUnit单元测试教程终极指南 说明 单元测试简介 1 什么是单元测试 2 测试覆盖 3 Java中的单元测试 JUnit简介 1 使用Eclipse实现简单JUn ...
- Dynamics CRM2016 Web API之删除单个查找字段值
之前的博文中有介绍过,Web Api中的一个删除单个属性的Api但没提供查找字段的删除方法,本篇补充上,这里给出的示例代码是C#的(主要看url的拼接),看下url中最后的/$ref,这个标示表明了当 ...
- valgrind检测内存泄漏
Valgrind 使用 用法:valgrind [options] prog-and-args [options]: 常用选项,适用于所有Valgrind工具 -tool=<name>最常 ...
- Android简易实战教程--第四十一话《vitamio网络收音机》
在Android初级教程专栏里面,介绍了Android原生的VideoView和vitamio框架Android视频媒体相关,VideoView和开源框架vitamio.并演示了播放网络视频的对应的D ...
- Android Multimedia框架总结(十七)音频开发基础知识
请尊重分享成果,转载请注明出处,本文来自逆流的鱼yuiop,原文链接:http://blog.csdn.net/hejjunlin/article/details/53078828 近年来,唱吧,全民 ...
- Android开发之Path类使用详解,自绘各种各样的图形!
玩过自定义View的小伙伴都知道,在View的绘制过程中,有一个类叫做Path,Path可以帮助我们实现很多自定义形状的View,特别是配合xfermode属性来使用的时候.OK,那我们今天就来看看P ...
- Freemarker 浅析
今天分享一下一个模板语言的使用,它就是Freemarker,有点类似与前些日子做Python的Django中的模板语言,其实原理上都是相似的.所以这里就不对那些基础性的语法类的直至进行讲解了,就拿几个 ...
- Spring之Enterprise JavaBeans (EJB) integration
原文地址:需要FQ https://translate.google.com/translate?hl=zh-CN&sl=zh-CN&tl=zh-CN&u=http%3A%2F ...