知行

集合视图编程指南(二)

翻译自Collection View Programming Guide for iOS

集合视图基础

集合视图为了展示它的内容到屏幕上,它与多个不同对象合作。一些对象是自定义的而且必须被你的应用程序提供。例如,你的应用程序必须提供一个数据源来告诉集合视图有多少个项目展示。另有一些对象是由UIKit提供并且是基本集合视图设计的一部分。

像表格(UITableView)一样,集合视图是面向数据的对象,它的实现涉及到与你的应用程序对象的合作。了解在你的代码中必须做的需要一些关于集合视图怎样实现它做的背后信息。

集合视图是对象的合作

集合视图的设计把将要展示的数据和排列展示数据到屏幕上的方式分隔开来。虽然你的应用程序严格负责管理被展示的数据,但是它的视图展示被多个不同对象管理。表一列出UIKit中集合视图的类并根据它们在实现集合视图界面扮演的角色组织它们。大部分类被设计使用是无需任何子类,所有你可以应用很少的代码实现集合视图。而当你想超越所提供的行为,你也可以继承,并提供行为。

表一:




































用途 类/协议 描述
顶级容器和管理 UICollectionView
UICollectionViewController
UICollectionView为你的集合视图定义了可视化区域。这个类继承自UIScrollView并且在需要时包含巨大滚动面积。这个类也根据它从布局对象的布局接收布局信息以便于数据的展示。
UICollectionViewController对象为集合视图提供了视图控制器级别的管理支持。它的使用是可选的。
内容管理 UICollectionViewDataSource协议
UICollectionViewDelegate协议
数据源对象是跟集合视图关联的最重要的对象并且是你必须提供的之一。数据源管理集合视图的内容并创建展示数据需要的视图。为了实现数据源对象,你必须创建一个采用UICollectionViewDataSource协议的对象。
集合视图代理对象让你拦截来自集合视图的有意思的消息并自定义一个视图的行为。例如,你使用代理对象跟踪集合视图中项目的选中和高亮。不像数据源对象,代理对象是可选的。
展示 UICollectionReusableView
UICollectionViewCell
所有在集合视图显示的视图必须是UICollectionReusableView类的实例。这个类在被集合视图使用时支持循环使用机制。循环视图(而不是创建新的)提高总体性能并且在它滚动过程中特别地提高。
UICollectionViewCell对象是可重用视图的一个特别类型,用来主要数据项目。
布局 UICollectionViewLayout
UICollectionViewLayoutAttributes
UICollectionViewUpdateItem
UICollectionViewLayout的子类被称为布局对象,它们负责定义位置、大小和集合视图中单元格与可重用视图的可视化属性。
在布局处理过程中,布局对象创建布局属性对象(UICollectionViewLayoutAttributes类的实例)告诉集合视图何处及怎样显示单元格和可重用视图。
在集合视图中无论何时数据项目插入、删除或移动,布局对象会接收到UICollectionViewUpdateItem类的实例。你不需要自己创建该类的实例。
流布局 UICollectionViewFlowLayout
UICollectionViewDelegateFlowLayout
协议
UICollectionViewFlowLayout类是你可以用来实现网状或其它流布局的具体布局对象。你可以原样使用这个类或者配合流布局代理对象,它允许你动态地自定义布局信息。

表一显示了与集合视图关联的核心对象之间的关系。集合视图从它的数据源获取关于单元格显示的信息。数据源和代理对象是你的应用程序提供的自定义对象,它们用来管理内容,包括单元格的选中和高亮。布局对象负责决定这些单元格属于哪儿并且把这个信息以一个或多个布局属性对象的形式发给集合视图。接着,集合视图合并实际的单元格和布局信息来创建最终的视觉呈现。

当创建一个集合视图界面,你首先添加一个UICollectionView对象到故事板或nib文件。想象集合视图作为中心枢纽,所有的其它对象从它发出的。在添加之后,你可以开始配置相关的对象,如数据源或代理。所有的配置都是围绕着集合视图自己。例如,你永远不会在没有创建集合视图对象的情况下创建布局对象。

可重用视图提升性能

集合视图采用了视图再循环方案来提高效率。当视图移动到屏幕之外,它们从视图中移除并被放到一个重用队列而不是被删除。当新内容滚动到屏幕,视图从队列中移出并被新内容改变意图。为了促进再循环和重用,所有被集合视图展示的视图必须继承自UICollectionReusableView类。

集合视图支持三个明显不同类型的可重用视图,每一个都具有特定的打算的用途:

  • 单元格(Cells)呈现集合视图的主要内容。单个单元格的工作是展示来自数据源的单个项目的内容。每个单元格必须是UICollectionViewCell类的实例,你可能需要子类化。单元格对象为管理它们自己的选中和高亮状态提供生来具有的支持。为了实际应用高亮到单元格,你必须写一些定制的的代码。详情查看管理视觉的选中和高亮状态

  • 补充(Supplementary)视图展示关于一个区段的信息。像单元格,补充是数据驱动的;不像单元格,补充不是强制的,并且它们的用途和放置是被使用的布局对象控制的。例如,流布局支持页眉和页脚作为可选的补充视图。

  • 装饰(Decoration)视图是视觉的装饰品,它们是整个属于布局对象而且不绑定任何你的数据源对象中的数据。例如,布局对象可能使用装饰视图实现定制的背景外观。

不像表视图(table views),集合视图不强加特定的类型到单元格上并且补充视图是数据源提供的。相反,基本的可重用视图类是空白的画布,你可以自己修改。例如,你可以使用它们创建小的视图层次,来显示图片,甚至动态地画内容。

你的数据源负责向与它关联的集合视图提供单元格和补充视图。然而,你的数据源并不直接创建视图。当被要求一个视图,你的数据源使用集合视图的方法出列一个想要类型的视图。出列处理总会返回一个可用的视图,或是从可重用队列取回,或是使用类、nib文件,或是你提供的故事板创建一个新视图。

布局对象控制视觉的展示

布局对象是唯一的负责决定集合视图中项目的放置和视觉类型。虽然你的数据源提供视图和实际的内容,但是布局对象决定大小、位置和这些视图其它的与外观相关的属性。这种职责上的分工使动态改变布局而不改变你的应用程序管理的任何数据成为可能。

集合视图使用的布局处理涉及但跟其它应用程序视图的布局处理明显不同。换而言之,不要混淆布局对象使用layoutSubviews方法重定位在父视图中的子视图。布局对象从不接触它直接管理的视图,因为它实际上并不拥有这些视图。相反,它产生在集合视图中的属性来描述位置,大小,单元格、补充、装饰视图上的外观。接下来,集合视图的工作就是应用这些属性到实际的视图对象上。

在集合视图中没有限制一个布局对象如何影响视图。布局对象可以移动一些视图,而不是其它。它可以只移动视图一点点,或者随意在屏幕周围移动。它甚至可以重定位视图而不用估计周围的视图。例如,布局对象如果想彼此紧挨着,它可以垂直堆叠。唯一真正的限制是布局对象如何影响你想要你的应用程序拥有的视觉风格。

下图显示一个垂直滚动流布局如何安排它的单元格和补充视图。在垂直滚动流布局中,内容面积的宽保持固定,而高度增长以适应内容。为了计算面积,布局对象一次一次放置视图和单元格,为它们选中最合适的位置。无论是在布局对象或使用代理,在这种情况下,单元格和补充视图的大小被指定为属性。计算布局,只是使用属性来放置视图的问题。

布局对象不仅仅控制视图的大小和位置。布局对象可以指定其它视图相关的属性,像它的透明度,在3
D空间的变换,在其它视图之上或之下的可见度。这些属性使你可以创建更有意思的布局。

集合视图自动初动始画

集合视图打造了在基础层面的动画支持。当你插入(删除)项目或区段,集合视图自动活跃任何被改变影响的视图。例如,当你插入一个项目,在插入点后面的项目通常转向以腾出空间给新的项目。因为集合视图发现项目的当前视图并且能计算发生插入后的最终位置,所以它能创建这些动画。因此,它可以动画每个项目从初始位置到最终位置。

除了动画插入、删除和移动操作,你可以在任何时间取消布局并强制它重新计算它的布局属性。取消布局不会直接动画项目;当你取消布局,集合视图展示项目在它最近计算的位置,而且没有动画。相反,在一个自定义布局,你可以定期使用这个行为定位单元格并创建动画效果。