FSQCollectionViewAlignedLayout 1.1.1

FSQCollectionViewAlignedLayout 1.1.1

测试已测试
Lang语言 Obj-CObjective C
许可 自定义
发布最后发布2015年4月

Brian DorfmanSam Grossberg 维护。



  • 作者
  • Brian Dorfman 和 Cameron Mulhern

一个简单、通用的收藏视图布局,具有多种自定义选项。

概览

FSQCollectionViewAlignedLayout 是一个通用收藏视图布局,旨在非常有灵活性和可配置性。它的目标是让用户无需每次当 UICollectionViewFlowLayout 不适用于它们的视图时都编写自己的自定义布局类。

布局就像一个非常简单的排版软件,其中每个单元就像一个“单词”或字体符号,每个部分就像一个“段落”,包含多行单元。

这个类在它的头文件(应该通过 Xcode 的文档弹出窗口自动解析并获取)中进行了彻底的文档记录,但此文件包括对其功能的概述。

设置

对齐布局只有两个文件,没有外部依赖项,所以它应该很容易添加到您的项目中。只需将文件添加到您的项目中,然后您就可以开始使用对齐布局来使用您的收藏视图。

我们建议使用 git submodules 将您的仓库链接到这个仓库,以便在未来版本发布时易于更新。

部分属性

FSQCollectionViewAlignedLayoutSectionAttributes 类定义了自定义收藏视图部分布局的属性。

如果您所有部分都具有相同的属性,您可以在布局上设置 defaultSectionAttributes 属性。或者,您可以在您的代理中实现以下方法以返回每个部分的不同属性

- (FSQCollectionViewAlignedLayoutSectionAttributes *)collectionView:(UICollectionView *)collectionView
                                                             layout:(FSQCollectionViewAlignedLayout *)collectionViewLayout
                                        attributesForSectionAtIndex:(NSInteger)sectionIndex;

以下部分属性可用

FSQCollectionViewHorizontalAlignment horizontalAlignment — 此属性对齐收藏视图的每行,相对于整个部分。选项有 LeftRightCenter

FSQCollectionViewVerticalAlignment verticalAlignment — 如果相同行的单元格高度不同,该属性会将其相对于彼此垂直对齐。选项是 TopBottomCenter

CGFloat itemSpacing — 这是相同行单元格之间的水平间距(以点为单位)。

CGFloat lineSpacing — 这是指段中一行底部与下一行顶部之间的垂直间距(以点为单位)。每一行的边界框被视为一个矩形,恰好包围该行上的每个单元格。因此,如果同一行上的单元格高度不均匀,则它们与下一行或前一行的垂直空间可能会更大(这取决于许多其他因素,例如垂直对齐和单元格填充)。

UIEdgeInsets insets — 这是指该部分四周(上下左右)的点间距。该部分的边界框被视为一个矩形,恰好包含该部分中的每一行。

该类实例不可变,因此您必须在创建时定义所有属性。有两个用于创建新的属性对象的类方法

+ (instancetype)withHorizontalAlignment:(FSQCollectionViewHorizontalAlignment)horizontalAlignment
                      verticalAlignment:(FSQCollectionViewVerticalAlignment)verticalAlignment;

此方法根据指定的对齐方式创建一个新部分属性对象。默认行间距和项目间距为5点,没有填充(UIEdgeInsetsZero)。

+ (instancetype)withHorizontalAlignment:(FSQCollectionViewHorizontalAlignment)horizontalAlignment
                      verticalAlignment:(FSQCollectionViewVerticalAlignment)verticalAlignment
                            itemSpacing:(CGFloat)itemSpacing
                            lineSpacing:(CGFloat)lineSpacing
                                 insets:(UIEdgeInsets)insets;

此方法与上述方法相同,但允许您指定自己的间距和填充。

此外,该类定义了四个共享指针,用于常用对齐方式,以方便使用。

+ (FSQCollectionViewAlignedLayoutSectionAttributes *)topLeftAlignment;
+ (FSQCollectionViewAlignedLayoutSectionAttributes *)topCenterAlignment;
+ (FSQCollectionViewAlignedLayoutSectionAttributes *)topRightAlignment;
+ (FSQCollectionViewAlignedLayoutSectionAttributes *)centerCenterAlignment;

单元格属性

FSQCollectionViewAlignedLayoutCellAttributes类定义了自定义收藏视图中单元格布局的属性。

如果您的所有单元格具有相同的属性,则可以在布局上设置defaultCellAttributes属性。或者,您可以在您的代理中实现以下方法,以返回每个单元格的不同属性

- (FSQCollectionViewAlignedLayoutCellAttributes *)collectionView:(UICollectionView *)collectionView
                                                          layout:(FSQCollectionViewAlignedLayout *)collectionViewLayout
                                    attributesForCellAtIndexPath:(NSIndexPath *)indexPath;

可用的单元格属性如下

UIEdgeInsets insets — 这是指单元格四周(上下左右)的点间距。对于布局定位,这些填充会添加到单元格大小上。例如,一个50x50点的单元格四周有5点填充,将像一个60x60点的单元格那样布局。然而,实际的UICollectionViewCell类最终将达到您报告的正确大小。

BOOL shouldBeginLine — 如果是YES,这会强制单元格成为该行上的第一个单元格,如果不是这种方式布局。

BOOL shouldEndLine — 如果是YES,这会强制单元格成为该行上的最后一个单元格,如果不是这种方式布局。

BOOL startLineIndentation — 如果是YES并且部分的排列是LeftRight,这将强制未来所有行与单元格的左边缘或右边缘对齐。所有未来的行的可用宽度将会降低,并且会添加适当的侧边填充以使其内嵌。缩进从单元格的实际边角开始,不包括填充。每个部分只能有一个缩进;同一部分中的后续单元格的缩进会覆盖之前的缩进。

该类的实例不可变,因此您必须在创建时定义所有属性。有一个用于创建新属性对象的类方法

+ (instancetype)withInsets:(UIEdgeInsets)insets
           shouldBeginLine:(BOOL)shouldBeginLine
             shouldEndLine:(BOOL)shouldEndLine
      startLineIndentation:(BOOL)startLineIndentation;

此方法创建一个具有指定值的新的单元格属性对象。

此外,该类定义了一个没有填充、没有换行符和没有缩进的默认属性对象的共享指针。

+ (FSQCollectionViewAlignedLayoutCellAttributes *)defaultCellAttributes;

单元格大小

如果您所有单元格的大小相同,您可以在布局上设置defaultCellSize属性。或者,您可以在您的代理中实现以下方法来返回每个单元格的不同大小

- (CGSize)collectionView:(UICollectionView *)collectionView
                  layout:(FSQCollectionViewAlignedLayout *)collectionViewLayout
  sizeForItemAtIndexPath:(NSIndexPath *)indexPath
      remainingLineSpace:(CGFloat)remainingLineSpace;

这反映了UICollectionViewDelegateFlowLayout所使用的尺寸委托方法,但增加了remainingLineSpace参数。此参数包含正在布局的当前行上剩余的水平空间量。如果您返回宽度小于或等于剩余行空间的尺寸,则它将因此与同一行布局(除非有任何其他单元格属性可能会更改此设置,例如换行符)。当您想根据宽度计算高度以填充其余行的空间时,这可能会很有用(例如,用于文本或图像尺寸目的)。

顶层属性

布局有以下顶层属性,用于自定义整个集合视图。

CGSize defaultCellSize —— 如果未实现相应的委托方法,则此尺寸用于所有单元格。默认为100x100点。

FSQCollectionViewAlignedLayoutSectionAttributes *defaultSectionAttributes —— 如果未实现相应的委托方法,则使用此属性对象用于所有部分。如果未设置,默认值为FSQCollectionViewAlignedLayoutSectionAttributes topLeftAlignment]。

FSQCollectionViewAlignedLayoutCellAttributes *defaultCellAttributes —— 如果未实现相应的委托方法,则使用此属性对象用于所有单元格。如果未设置,默认值为[FSQCollectionViewAlignedLayoutCellAttributes defaultCellAttributes]。

CGFloat sectionSpacing —— 这是底部部分与下一个部分的顶部之间的垂直间距(以点为单位)。部分的外框被认为是恰好包含部分中所有行的矩形。如果未设置,默认值为10点。

UIEdgeInsets contentInsets —— 这是围绕集合视图内容的四个边框的间距(以点为单位)。外框是一个恰好包含集合中所有部分的矩形。如果未设置,则默认为所有边框的5点间距。

BOOL shouldPinSectionHeadersToTop —— 这控制当前顶部部分标题是否固定在视图的顶部,类似于使用UITableViewStylePlain时UITableView的工作方式。默认值为YES。

贡献者

FSQCollectionViewAlignedLayout最初由Foursquare Labs为内部使用开发。它最初由Brian Dorfman编写(@bdorfman)并由Brian Dorfman和Cameron Mulhern维护。