iOS之UICollectionView(一)

集合视图(Collection view)是一种可以灵活显示有序数据项集的视图.集合视图使用十分广泛,也很强大.最常见的用途是以类似于网格的方式呈现项目.

collection view基础


为了在屏幕上显示其内容,集合视图与许多不同的对象协作.有些对象是自定义的,必须由您的应用程序提供.例如,您的应用程序必须提供一个dataSouce对象,该对象告诉集合视图要显示多少项.其他对象由UIKit提供,是基本集合视图设计的一部分.
像table view一样,集合视图是面向数据的对象,其实现涉及与应用对象的协作.

对象的协作

集合视图的数据和视觉效果由不同的对象来控制,数据和显示效果是分开的.
下图展示了集合视图和核心对象之间的关系.集合视图从dataSource中获取单元格的数据和视图.data Sourcedelegate对象是由您的应用程序提供的自定义对象,用于管理内容,包括单元格的选择和高亮显示.layout管理这些单元格在集合视图中所属的位置,并以一个或多个布局属性(layout attribute)对象的形式将该信息发送到集合视图.然后,集合视图将布局信息与实际单元格(和其他视图)合并,以创建最终的可视化表示.

下面是一些相关的类或者协议:

顶级容器和管理器
  • UICollectionView:
    该类是UIScrollView的子类,提供一个可滚动的显示区域,以供数据的展示.
  • UICollectionViewController:
    该类的使用是可选的,是UIViewController的子类,是UICollectionView的控制器,也可以使用普通的controller添加collectionView和代理来代替
内容管理
  • UICollectionViewDataSource协议:
    数据源对象管理自定义的cell和一些显示的数据.必须提供一个显示了该协议的数据源对象.
  • UICollectionViewDelegate协议:
    该对象是可选的,该对象管理自定义的行为.例如,可以使用该实现了该协议的对象来追踪项目,高亮显示,点击事件等.
子视图
  • UICollectionReusaleView:
    所有在collection view中显示的view必须都是该类的实例.这个类支持集合视图使用的回收机制.回收视图(而不是创建新视图)可以提高整体性能,特别是在滚动期间可以提高性能.
  • UICollectionViewCell:
    UICollectionViewCellUICollectionReusableView的子类,是专门用来显示数据的视图.是必须实现的.
布局
  • UICollectionViewLayout:
    UICollectionViewLayout的子类,负责定义集合视图内的单元格和可重用视图的位置,大小和视觉属性。
  • UICollectionViewLayoutAttributes:
    在布局过程中,布局对象创建布局属性对象(UICollectionViewLayoutAttributes类的实例),告诉集合视图在何处以及如何显示单元格和可重用的视图
  • UICollectionViewUpdateItem:
    在集合视图中插入,删除或移动数据项,布局对象就会接收该类的实例.该类不用自行创建.
流式布局(瀑布)
  • UICollectionViewFlowLayout:
    UICollectionViewLayout的子类,如果页面是线性布局的,可以使用这个layout
  • UICollectionViewDelegateFlowLayout协议:
    UICollectionViewDelegate的子类,可以实现UICollectionViewDelegate的功能还可以定义流式布局的行为.

重用视图以提供性能

集合视图采用可重用的视图来提高效率.当视图移出屏幕时,它们将置于重用队列中,而不是被删除.当内容重新移入屏幕,视图将从队列出列,并用新内容重新使用.为了便于回收和再利用,视图集合的显示所有视图都必须继承自UICollectionReusableView类.
集合视图支持三种不同的可重用视图:

  • 单元格视图(cells):单元格的工作是从数据源(dataSource)对象中获取数据呈现单个项目的内容.每个单元格必须是UICollectionViewCell的一个实例,您可以根据需要创建子类化定制显示内容.单元对象为管理自己的选择和高亮显示状态提供了固有的支持.
  • Supplementary views:像cells一样,Supplementary view对象也是数据驱动的,可以定制每组数据的单元格以外的显示,比如footer View和header view,该视图不是必须的.
  • Decoration views:提供视图背景等

与table view不同,collection view没有提供默认的单元数据显示样式,您可以使用它们构建小视图层次结构,显示图像,甚至动态地绘制内容.所以,collection view的使用比table view更为复杂和灵活.

使用Layout对象控制显示

Layout对象全权负责确定集合视图中项目的布局和视觉样式.尽管dataSource对象提供了视图和实际内容,但layout对象决定了这些视图的大小,位置以及其他与外观相关的属性.这种责任分离使得我们可以动态改变布局,而不需要改变由你的应用管理的任何数据对象.

集合视图使用的布局过程与应用程序其余视图使用的布局过程相关,但与之不同.换句话说,混淆不要布局对象与layoutSubviews用于在父视图内重新定位子视图的方法.布局对象从不触及其直接管理的视图,因为它实际上并不拥有任何这些视图.而是生成描述集合视图中单元格,补充视图和装饰视图的位置,大小和可视外观的属性.这就是集合视图的工作,将这些属性应用于实际的视图对象.

布局对象如何影响集合视图中的视图没有限制.布局对象可以只移动一些视图,可以只移动一点距离,也可以在屏幕上随意移动它们.它甚至可以重新定位视图,而不考虑周围的视图.例如,如果需要,布局对象可以将视图堆叠在一起.唯一真正的限制是布局对象如何影响你想要的应用程序的视觉风格.

下图显示了垂直滚动流布局如何排列单元格和补充视图.在垂直滚动流布局中,内容区域的宽度保持固定,并且高度增长以适应内容.为了计算面积,布局对象一次放置一个视图和单元格,为每个布局对象选择最合适的位置.在流布局的情况下,单元格和补充视图的大小被指定为布局对象上的属性(attribute)或使用delegate.计算布局只是使用这些属性来放置每个视图的问题.


Layout对象不止能控制大小和位置,还可以设置透明度,3D效果等.

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 202,980评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,178评论 2 380
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,868评论 0 336
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,498评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,492评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,521评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,910评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,569评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,793评论 1 296
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,559评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,639评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,342评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,931评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,904评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,144评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,833评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,350评论 2 342

推荐阅读更多精彩内容

  • 翻译自“Collection View Programming Guide for iOS” 0 关于iOS集合视...
    lakerszhy阅读 3,810评论 1 22
  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 171,380评论 25 707
  • 在进入大数据移动互联网时代之后,我们认为平台化的商业模式将大行其道。根据这样的形式,我们认为有两个符合逻辑的推演。...
    穆青玄阅读 289评论 0 0
  • linux中一切皆文件
    大神华仔阅读 217评论 0 0
  • 小确幸:有人来了,有人走了~来了,是因为想改变自己的现状;走了,也许是因为还没有足够的勇气和毅力去真正的改变自己。...
    糖月阳阅读 116评论 0 0