Container view-容器视图
Collection Views
使用可配置且高度可自定义的布局显示嵌套视图。
View
UICollectionView
管理数据项目的有序集合并使用可定制布局呈现它们的对象。
Overview
50390428-f9f2-4cbc-bd99-1cacca4f0617.png将集合视图添加到用户界面时,应用程序的主要工作是管理与该Collection view关联的数据。 Collection view从数据源对象获取数据,该数据源对象是符合UICollectionViewDataSource协议并由应用程序提供的对象。 Collection view中的数据被组织成单个项目,然后可以将它们分组以分段显示。 项目是要呈现的最小数据单位。 例如,在照片应用程序中,项目可能是单个图像。 Collection view使用单元显示屏幕上的项目,该单元是数据源配置并提供的UICollectionViewCell类的实例。
除了单元格之外,Collection view还可以使用其他类型的视图呈现数据。 这些补充视图可以是部分页眉和页脚,它们与单个单元格分开,但仍然传达某种信息。 对补充视图的支持是可选的,并由Collection view的布局对象定义,该对象还负责定义这些视图的位置。
除了将其嵌入用户界面之外,您还可以使用UICollectionView对象的方法来确保项目的可视化表示与数据源对象中的顺序相匹配。 因此,无论何时添加,删除或重新排列集合中的数据,都可以使用此类的方法来插入,删除和重新排列相应的单元格。 您还可以使用Collection view对象来管理选定的项目,但对于此行为,Collection view与其关联的委托对象一起工作。
Collection Views and Layout Objects
与Collection view关联的一个非常重要的对象是Layout Objects,它是UICollectionViewLayout类的子类。 Layout Objects负责定义Collection view内所有单元和补充视图的组织和位置。 虽然它定义了它们的位置,但Layout Objects实际上并不会将该信息应用于相应的视图。 由于单元格和补充视图的创建涉及到Collection view和数据源对象之间的协调,Collection view实际上将布局信息应用于视图。 因此,从某种意义上说,Layout Objects就像另一个数据源,只提供视觉信息而不是项目数据。
您通常在创建Collection view时指定Layout Objects,但也可以动态更改Collection view的布局。 Layout Objects存储在collectionViewLayout属性中。 设置此属性会直接更新布局,而不会动画更改。 如果要为更改设置动画,则必须调用setCollectionViewLayout:animated:completion:方法。
如果要创建交互式过渡 - 由手势识别器或触摸事件驱动的过渡 - 使用startInteractiveTransitionToCollectionViewLayout:completion:方法更改布局对象。 该方法安装一个中间布局对象,其目的是与您的手势识别器或事件处理代码一起使用以跟踪转换进度。 当事件处理代码确定转换完成时,它会调用finishInteractiveTransition或cancelInteractiveTransition方法来删除中间Layout Objects并安装预期的目标Layout Objects。
Creating Cells and Supplementary Views 创建单元格和补充视图
Collection Views的数据源对象提供了项目的内容和用于呈现该内容的视图。 当Collection Views首次加载其内容时,它会要求其数据源为每个可见项目提供一个视图。 为了简化代码的创建过程,Collection Views要求您始终使视图出列,而不是在代码中明确创建它们。 有两种出列视图的方法。 您使用的取决于所请求的视图类型:
- 使用dequeueReusableCellWithReuseIdentifier:forIndexPath:获取集合视图中项目的单元格。
- 使用dequeueReusableSupplementaryViewOfKind:withReuseIdentifier:forIndexPath:方法获取布局对象请求的补充视图。
在调用其中任何一种方法之前,必须告诉Collection view如何创建相应视图(如果尚不存在)。 为此,您必须使用Collection view注册一个类或一个nib文件。 例如,注册单元格时,可以使用registerClass:forCellWithReuseIdentifier:或registerNib:forCellWithReuseIdentifier:方法。 作为注册过程的一部分,您需要指定标识视图用途的重用标识符。 这是您以后使用该字符串时使用的字符串。
在您的委托方法中取消适当的视图后,配置其内容并将其返回到Collection view以供使用。 从Layout Objects获取布局信息后,Collection view将其应用于视图并显示它。
有关实现数据源方法以创建和配置视图的更多信息,请参阅UICollectionViewDataSource。https://developer.apple.com/documentation/uikit/uicollectionviewdatasource?language=objc
Reordering Items Interactively以交互方式重新排序项目
Collection view允许您基于用户交互移动项目。 通常,Collection view中的项目顺序由您的数据源定义。 如果您支持用户重新排序项目的功能,则可以配置一个手势识别器来跟踪用户与Collection view项目的交互并更新该项目的位置。
要开始项目的交互式重新定位,请调用Collection view的beginInteractiveMovementForItemAtIndexPath:方法。 当您的手势识别器正在跟踪触摸事件时,请调用updateInteractiveMovementTargetPosition:方法来报告触摸位置中的更改。 完成跟踪手势后,调用endInteractiveMovement或cancelInteractiveMovement方法来结束交互并更新集合视图。
在用户交互过程中,Collection view会动态地使其布局无效以反映项目的当前位置。 如果您什么也不做,默认布局行为会为您重新定位项目,但是您可以根据需要自定义布局动画。 交互完成后,使用该项目的新位置更新其数据源对象。
UICollectionViewController类提供了默认的手势识别器,您可以使用该手势来重新排列其托管集合视图中的项目。 要安装此手势识别器,请将集合视图控制器的installsStandardGestureForInteractiveMovement属性设置为YES。
Interface Builder Attributes界面生成器属性
表1列出了您在Interface Builder中为集合视图配置的属性。
Items
原型单元的数量。 此属性控制指定数量的原型单元格供您在故事板中进行配置。 集合视图必须始终具有至少一个单元格,并且可能有多个单元格用于显示不同类型的内容或以不同方式显示相同的内容。
Layout
要使用的布局对象。 使用此控件在UICollectionViewFlowLayout对象和您定义的自定义布局对象之间进行选择。
选择流布局时,您还可以配置集合视图内容的滚动方向以及流布局是否包含页眉和页脚视图。 启用页眉和页脚视图为故事板添加了可重复使用的视图,您可以使用页眉和页脚内容进行配置。 您也可以编程方式创建这些视图。
当选择自定义布局时,您必须指定要使用的UICollectionViewLayout子类。
选择流布局时,集合视图的大小检查器包含用于配置流布局度量标准的其他属性。 使用这些属性来配置单元格的大小,页眉和页脚的大小,单元格之间的最小间距以及每个单元格区域的任何边距。 有关流布局度量标准含义的更多信息,请参阅UICollectionViewFlowLayout。https://developer.apple.com/documentation/uikit/uicollectionviewflowlayout?language=objc
Accessibility
Collection view没有其自己的内容可供访问。 如果您的单元格和可重用视图包含标准的UIKit控件,如UILabel和UITextField,则可以使这些控件可访问。 当Collection view更改其屏幕布局时,它将张贴UIAccessibilityLayoutChangedNotification通知。
有关使您的界面可访问的一般信息,请参阅适用于iOS的辅助功能编程指南。https://developer.apple.com/library/content/documentation/UserExperience/Conceptual/iPhoneAccessibility/Introduction/Introduction.html#//apple_ref/doc/uid/TP40008785
Topics
Initializing a Collection View
- initWithFrame:collectionViewLayout:
使用指定的框架和布局初始化并返回新分配的集合视图对象。
- (instancetype)initWithFrame:(CGRect)frame
collectionViewLayout:(UICollectionViewLayout *)layout;
参数
frame
集合视图的框架矩形,以点测量。 框架的起源与您打算添加它的超级视图有关。 该帧在初始化期间传递给超类。
布局
用于组织项目的布局对象。 集合视图存储对指定对象的强引用。 一定不能是零。
返回值
初始化的Collection View对象,如果无法创建对象,则为nil。
Providing the Collection View Data
dataSource
为collection view提供数据的对象。
@property(nonatomic, weak) id<UICollectionViewDataSource> dataSource;
数据源必须采用UICollectionViewDataSource协议。 collection view维护对数据源对象的弱引用。
UICollectionViewDataSource
采用UICollectionViewDataSource协议的对象负责提供集合视图所需的数据和视图。 数据源对象表示您的应用程序的数据模型,并根据需要将信息发布到集合视图。 它还处理单元格的创建和配置以及集合视图使用的补充视图来显示数据。
至少,所有数据源对象都必须实现collectionView:numberOfItemsInSection:和collectionView:cellForItemAtIndexPath:方法。 这些方法负责返回集合视图中的项目数量以及项目本身。 协议的其余方法是可选的,只有在您的集合视图将项目组织为多个部分或为给定部分提供页眉和页脚时才需要。
配置集合视图对象时,将数据源分配给其dataSource属性。
获取项目和部分指标Getting Item and Section Metrics
collectionView:numberOfItemsInSection:
- (NSInteger)collectionView:(UICollectionView *)collectionView
numberOfItemsInSection:(NSInteger)section;
Asks your data source object for the number of items in the specified section.
numberOfSectionsInCollectionView:
- (NSInteger)numberOfSectionsInCollectionView:(UICollectionView *)collectionView;
The number of sections in collectionView.
获取项目视图Getting Views for Items
collectionView:cellForItemAtIndexPath:
询问您的数据源对象是否与集合视图中指定项目对应的单元格。
- (__kindof UICollectionViewCell *)collectionView:(UICollectionView *)collectionView
cellForItemAtIndexPath:(NSIndexPath *)indexPath;
此方法的实现负责创建,配置和返回给定项目的适当单元格。您可以通过调用collection视图的dequeueReusableCellWithReuseIdentifier:forIndexPath:方法并传递与所需单元格类型对应的重用标识符来完成此操作。该方法总是返回一个有效的单元对象。在收到单元格后,您应该设置与相应项目的数据相对应的任何属性,执行任何其他所需的配置并返回单元格。
您不需要在集合视图的边界内设置单元格的位置。集合视图使用布局对象提供的布局属性自动设置每个单元格的位置。
如果集合视图上的prefetchingEnabled设置为YES,则在出现单元格之前调用此方法。使用collectionView:willDisplayCell:forItemAtIndexPath:delegate方法对单元格外观进行任何更改以反映其视觉状态(如选择)。
此方法必须始终返回有效的视图对象。
collectionView:viewForSupplementaryElementOfKind:atIndexPath:
- (UICollectionReusableView *)collectionView:(UICollectionView *)collectionView
viewForSupplementaryElementOfKind:(NSString *)kind
atIndexPath:(NSIndexPath *)indexPath;
此方法的实现负责创建,配置和返回正在请求的相应补充视图。您可以通过调用集合视图的dequeueReusableSupplementaryViewOfKind:withReuseIdentifier:forIndexPath:方法并传递与所需视图相对应的信息来完成此操作。该方法总是返回一个有效的视图对象。收到视图后,您应该设置与要显示的数据相对应的任何属性,执行任何其他所需的配置并返回视图。
您不需要在收集视图的边界内设置补充视图的位置。集合视图使用布局对象提供的布局属性来设置每个视图的位置。
此方法必须始终返回有效的视图对象。如果您不想在特定情况下使用补充视图,则布局对象不应为该视图创建属性。或者,可以通过将相应属性的隐藏属性设置为YES来隐藏视图,或者将属性的alpha属性设置为0.要隐藏流布局中的页眉和页脚视图,还可以设置这些视图的宽度和高度为0。
Reordering Items 重新排序项目
collectionView:canMoveItemAtIndexPath:
询问您的数据源对象是否可以将指定的项目移动到集合视图中的其他位置。
- (BOOL)collectionView:(UICollectionView *)collectionView
canMoveItemAtIndexPath:(NSIndexPath *)indexPath;
使用此方法可选择性地允许或禁止集合视图内的项目移动。 如果您没有实现此方法,但是您实现了collectionView:moveItemAtIndexPath:toIndexPath:方法,则集合视图允许对所有项目进行重新排序。
collectionView:moveItemAtIndexPath:toIndexPath:
通知您的数据源对象将指定的项目移动到其新位置。
- (void)collectionView:(UICollectionView *)collectionView
moveItemAtIndexPath:(NSIndexPath *)sourceIndexPath
toIndexPath:(NSIndexPath *)destinationIndexPath;
您必须实现此方法以支持对集合视图中的项目进行重新排序。 如果您未实现此方法,那么集合视图将忽略任何重新排序项目的尝试。
与项目交互结束时,如果项目位置发生更改,集合视图将调用此方法。 使用此方法使用新的索引路径信息更新您的数据结构。
配置索引 Configuring an index
indexTitlesForCollectionView:
要求数据源返回索引项目的标题以显示collection view。
- (NSArray<NSString *> *)indexTitlesForCollectionView:(UICollectionView *)collectionView;
用于每个索引条目标题的字符串数组。 例如,您可能会返回一个包含字母([“A”,“B”,“C”,...,“Z”))的字符串数组。
使用此方法可支持快速滚动收集视图的内容。 您返回的字符串显示在索引视图中,该视图可用于跳转到集合视图内容中的特定位置。 如果实现此方法,则还必须实现collectionView:indexPathForIndexTitle:atIndex:方法以指定与每个索引标题关联的集合视图项目。
collectionView:indexPathForIndexTitle:atIndex:
请求数据源返回与其中一个索引条目对应的集合视图项目的索引路径。
- (NSIndexPath *)collectionView:(UICollectionView *)collectionView
indexPathForIndexTitle:(NSString *)title
atIndex:(NSInteger)index;
使用此方法可支持快速滚动收集视图的内容。 从indexTitlesForCollectionView:方法返回一组索引字符串后,集合视图为每个字符串调用此方法以获取集合视图项目以用作滚动目标。
网友评论