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的构建方式,你已经使用了许多的设计模式以及被鼓励的最佳实践. ...
随机推荐
- 优化Webpack打包速度
1. Webpack 可以配置 externals 来将依赖的库指向全局变量,从而不再打包这个库,比如对于这样一个文件: import React from 'react'; console.lo ...
- Vue-起步篇:Vue与React、 Angular的区别
毋庸置疑,Vue.React. Angular这三个是现在比较火的前端框架.这几个框架都各有所长,选择学习哪种就得看个人喜好或者实际项目了.相比之下, Vue 是轻量级且容易学习掌握的. 1.Vue和 ...
- 前端开发利器VSCode
最近找到一款非常好用的开发利器,VSCode.一直认为微软做的东西都很一般,这个软件让我刮目相看了. 之前使用webstorm卡的不行,换了这个非常好用. 用着还不错,这里记录下一些使用的心得. VS ...
- c#下winform的ftp上传
/* FTPFactory.cs Better view with tab space=4 Written by Jaimon Mathew (jaimonmathew@rediffmail.com) ...
- vs2017 +CUDA 9.0配置
环境: 1.Win7 64位 旗舰版 2.VS2017 3.CUDA 9.0 安装过程比较简单,直接运行在官网下载的CUDA安装包就可以了. 建议先安装VS,再安装CUDA.这样安装完之后会在VS里直 ...
- 解决linux中使用git,ssh每次都要输入密码
在linux中使用git,去提交或者下载代码都是很方便的,但是最近新配置了一套系统,发现每次git pull或者其他动作都需要输入密码. 想一想不对劲啊,我使用的是ssh的方式clone的代码,而且在 ...
- python通过token登录,并爬取数据实例
from bs4 import BeautifulSoup import requests class Zabbix(object): def __init__(self, headers): sel ...
- Python3 OS 文件/目录方法
os 模块提供了非常丰富的方法用来处理文件和目录.常用的方法如下表所示: 序号 方法及描述 1 os.access(path, mode) 检验权限模式 2 os.chdir(path) 改变当前工作 ...
- 前端技术之_CSS详解第二天
前端技术之_CSS详解第二天 1.css基础选择器 html负责结构,css负责样式,js负责行为. css写在head标签里面,容器style标签. 先写选择器,然后写大括号,大括号里面是样式. & ...
- 解决ASP.NET MVC 检测到有潜在危险的 Request.Form 值
提交使用html编辑器编辑后的数据,由于Request时出现有HTML或JavaScript等字符串时,系统会认为是危险性值.立马报错. "从客户端 ... 中检测到有潜在危险的 Reque ...