集合视图基本知识
为了将其内容呈现在屏幕上,集合视图与许多不用的对象配合使用。有些对象是自定义的,并且必须由你的应用程序提供。例如,你的app必须提供一个数据源对象,来告诉集合视图有哪多少个items
要显示。其他对象由UIKit
来提供,也是基本集合视图设计的一部分。
与表视图类似,集合视图是面向数据对象,其实现涉及与你的app的对象的协作。了解在你的代码中你必须做什么,需要一些关于集合视图如何执行操作的背景信息。
集合视图是对象的协作
集合视图的设计将 数据从数据排列和显示的方式分离开来。虽然你的app严格负责管理要呈现的数据,但它的可视化呈现是由许多不同的对象来管理的。表1-1列出了在UIKit中的集合视图类和在实现集合视图接口中的角色进行组织。大多数类被设计为被使用而不需要进行子类化,因此你通常可以使用很少的代码来实现集合视图,当你想超越提供的行为,你可以子类化并提供这种行为。
表1-1 用于实现集合视图的类和协议
目的 | 类/协议 | 描述 |
---|---|---|
顶级容量和管理 |
UICollectionView UICollectionViewController
|
一个集合视图对象定义了你的集合视图内容的可见区域。这个类起源于UIScrollView ,当需要的时候能够包含一个大的滚动区域。 这个类还可以根据它从布局对象接收到的布局信息来方便地显示数据。一个集合视图控制器对象为集合视图提供了视图控制器级别的管理。它的使用是可选的。 |
内容管理 |
UICollectionViewDataSource 协议UICollectionViewDelegate 协议 |
数据源对象是与集合视图关联最重要的对象并且是你必须提供的一个。数据源管理集合视图的内容并创建呈现该内容的视图。为了实现数据源对象,你必须创建一个遵守UICollectionViewDataSource 协议的对象。集合视图委托对象允许你从集合视图截取有趣的消息,并自定义视图的行为。例如,你使用委托对象来跟踪集合视图中的item的选择和高亮。不像数据源对象,委托对象是可选的。关于如何实现数据源和委托对象,请看Designing Your Data Source and Delegate. |
呈现层 |
UICollectionReusableView UICollectionViewCell
|
在集合视图上的所有视图显示必须是UICollectionReusableView 类的实例。这个类提供了一个集合视图的回收利用机制。回收视图(代替创建新视图)通常会提高性能,特别是在滚动的过程中。 UICollectionViewCell对象是你用于主数据项的特定类型的可重用视图。 |
布局 |
UICollectionViewLayout UICollectionViewLayoutAttributes UICollectionViewUpdateItem
|
UICollectionViewLayout 的子类称为布局对象,负责定义集合视图内的cells和可重用视图的位置,大小和视觉属性。 在布局过程中,布局对象创建布局属性对象(UICollectionViewLayoutAttributes 的实例),该对象告诉集合视图在何处和如何显示cells和可重用视图。 每当集合视图中插入、删除、或移动数据项时,布局对象接收UICollectionViewUpdateItem 类的实例,你不需要自己创建这个类的实例。 关于布局对象更多信息,请看The Layout Object Controls the Visual Presentation. |
流式布局 |
UICollectionViewFlowLayout UICollectionViewDelegateFlowLayout 协议 |
UICollectionViewFlowLayout 类是用于实现网格或其他基于行的布局的具体布局对象。你可以按照原样使用该类,或者与流式委托对象一起使用,可以动态自定义布局信息。 |
图1-1显示与集合视图相关的核心对象之间的关系。集合视图从它的数据源获取关于cells
来显示的信息。数据源和委托对象是由你的app提供的自定义对象并用来管理cells
的内容,包括选择和高亮。布局对象负责决定这些cells
所在的位置,并以一个或多个布局属性对象的形式将该信息发送给集合视图。然后,集合视图将布局信息与实际cells
(和其他视图)合并,以创建最终的可视化呈现。
当创建一个集合视图界面时,你先要添加一个UICollectionView
对象到你的故事板或nib文件中。将集合视图看作是中心焦点,所有其他对象都来自这个中心。添加该对象后,你就可以开始配置其他相关对象,例如数据源和代理。所有配置都以集合视图本身为中心。例如,你没有创建一个集合视图对象,就从不创建一个布局对象
可重用视图提高性能
集合视图采用视图回收程序来提高效率。当视图移出屏幕,它们将从视图中移除,并放置在重用队列中,而不是被删除。当新的内容滚动到屏幕上,视图从队列中移除并重新利用到新的内容上。为了方便这种循环和重用,集合视图上显示的所有视图,必须继承自UICollectionReusableView
类。
集合视图支持三种不同类型的可重用视图,每种都有特定的预期用途:
-
cells
代表你的集合视图的主内容。cell
的工作是用来呈现来自于你的数据源对象的单独item
的内容。每个cell
必须是UICollectionViewCell
类的实例,你可以根据需要来进行子类化来呈现你的内容。cell
对象为管理自己的选择和高亮状体提供了固有的支持。要将高亮应用于cell
,你必须写一些自定义代码。关于实现cell
的高亮/选中,请看Managing the Visual State for Selections and Highlights. - 补充视图显示关于一个部分的信息。与
cell
一样的是,补充视图也是数据驱动的。与cell
不一样的是,补充视图不是强制性的,它们的用法和布局 由使用的布局对象来控制。例如,流式布局支持页眉和页脚作为可选的补充视图。 - 装饰视图是由布局对象完全拥有的视觉装饰,并不与数据源对象中的任何数据相关联。例如,一个布局对象可能使用装饰视图来实现一个自定义背景的外观。
与表视图不同,集合视图不会对数据源提供的cell
和补充视图施加特定风格。相反,基本的可重用视图类是你可以修改的空白画布。例如,你可以用它们来构建小视图层级,来显示图片,甚至动态绘制内容。
你的数据源对象负责提供其关联的集合视图使用的cell
和补充视图。然而,数据源从不直接创建视图。当被要求查看时,你的数据源将使用集合视图的方法来将所需类型的视图列出。出队列过程总是返回一个有效的视图,无论是通过从重用队列中检索一个或通过使用你提供的类、nib文件或故事板来创建新视图。
关于如何从你的数据源来创建和配置视图,请看Configuring Cells and Supplementary Views.
布局对象控制视觉化呈现
布局对象完全负责确定集合视图中items
的位置和视觉样式。虽然你的数据源对象提供视图和实际内容,但布局对象确定这些视图的大小、位置、和其他外观相关属性。这种职责的分离使能够动态改变布局而不需要改变你的app管理的数据对象。
集合视图使用的布局过程与你的应用程序的视图使用的布局过程相关,但不同于此。换句话说,不要将布局对象与layoutSubviews
方法混淆,layoutSubviews
方法是用于在俯视图中重新定位子视图。一个布局对象从来没有触及直接管理的视图,因为它实际上并不拥有任何这些视图。相反,它生成集合视图中cells
、补充视图、和装饰视图的位置、大小等属性、和视觉外观。然后,集合视图的工作将这些属性应用到实际的视图对象中。
布局对象如何影响集合视图中的视图是没有限制的。一个布局对象可以移动一些视图,但不能一用其他视图。它可以移动视图一点点,或者它可以在屏幕上随机的移动它们。它甚至可以在不考虑周围视图的情况下重新定位视图。例如,布局对象如果愿意,可以在彼此顶部堆叠视图。唯一真实的限制是布局对象如何影响你的应用程序的视觉样式。
图1-2显示垂直滚动流式布局如何安排它的cells
和补充视图。在垂直滚动流式布局中,内容区域的宽度保持不变,并且高度增长以适应内容。为了计算面积,布局对象一次放置一个视图和cell,为每个对象选择最合适的位置。在流式布局的情况下,cell
和补充视图的大小在布局对象上或通过使用委托指定为属性。计算布局只是使用这些属性放置每个视图的问题。
布局对象不仅仅控制视图的大小和位置。布局对象可以指定其他视图相关属性,例如它的透明度、在三维空间中的转换以及其可见性(如果有的话)高于或低于其他视图。这些属性让你创建更有趣的布局。例如,例如,你可以通过将视图放在彼此顶部并更改z顺序来创建cell
堆栈,或者可以使用转换在任何轴上旋转它们。
有关布局对象如何履行对集合视图的责任的详细信息,请看Creating Custom Layouts.
集合视图自动启动动画
集合视图在基本层面上支持对动画的构建。当你插入(或删除)items
或sections
时,集合视图通过改变来自动动画影响的视图。例如,当你插入一个item
时,插入点之后的item
通常会移动,来为新item
腾出空间。集合视图可以创建这些动画,因为它检测到item
的当前位置,并可以在插入发生后计算其最终位置。因此,它可以将每个item
从其初始位置动画到其最终位置。
除了动画插入、删除和移动操作之外,还可以随时使布局无效,并强制重新计算其布局属性。无效的布局不直接为item
设置动画;当你使布局无效时,集合视图将显示其新计算位置中的item
,而不对其进行动画显示。相反,在自定义布局中,你可以使用此行为定期定位cell
并创建动画效果。
官方文档地址:
Collection View Basic
网友评论