集合视图(Collection view)是一种可以灵活显示有序数据项集的视图.集合视图使用十分广泛,也很强大.最常见的用途是以类似于网格的方式呈现项目.
collection view基础
为了在屏幕上显示其内容,集合视图与许多不同的对象协作.有些对象是自定义的,必须由您的应用程序提供.例如,您的应用程序必须提供一个dataSouce对象,该对象告诉集合视图要显示多少项.其他对象由UIKit
提供,是基本集合视图设计的一部分.
像table view一样,集合视图是面向数据的对象,其实现涉及与应用对象的协作.
对象的协作
集合视图的数据和视觉效果由不同的对象来控制,数据和显示效果是分开的.
下图展示了集合视图和核心对象之间的关系.集合视图从dataSource
中获取单元格的数据和视图.data Source
和delegate
对象是由您的应用程序提供的自定义对象,用于管理内容,包括单元格的选择和高亮显示.layout
管理这些单元格在集合视图中所属的位置,并以一个或多个布局属性(layout attribute
)对象的形式将该信息发送到集合视图.然后,集合视图将布局信息与实际单元格(和其他视图)合并,以创建最终的可视化表示.
下面是一些相关的类或者协议:
顶级容器和管理器
-
UICollectionView
:
该类是UIScrollView
的子类,提供一个可滚动的显示区域,以供数据的展示. -
UICollectionViewController
:
该类的使用是可选的,是UIViewController
的子类,是UICollectionView
的控制器,也可以使用普通的controller添加collectionView和代理来代替
内容管理
-
UICollectionViewDataSource
协议:
数据源对象管理自定义的cell和一些显示的数据.必须提供一个显示了该协议的数据源对象. -
UICollectionViewDelegate
协议:
该对象是可选的,该对象管理自定义的行为.例如,可以使用该实现了该协议的对象来追踪项目,高亮显示,点击事件等.
子视图
-
UICollectionReusaleView
:
所有在collection view中显示的view必须都是该类的实例.这个类支持集合视图使用的回收机制.回收视图(而不是创建新视图)可以提高整体性能,特别是在滚动期间可以提高性能. -
UICollectionViewCell
:
UICollectionViewCell
是UICollectionReusableView
的子类,是专门用来显示数据的视图.是必须实现的.
布局
-
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效果等.