为CollectionView生成排版信息的抽象基类.
概览
排版类的工作是决定 单元格,收集界面区域里的补充界面,装饰界面 的摆放,并在CollectionView 访问这些信息时能够提供.然后,CollectionView根据提供的排版信息把相关的界面显示在屏幕.
必须继承UICollectionViewLayout才能使用它,或者继承UICollectionViewFlowLayout,也许更能满足排版需求.
继承注意点
排版类的主要作用是提供关于收集界面里所有单位的位置和可见性的信息,但不会为这些单位创建界面.这些界面是通过收集界面的数据源创建的.而排版类定义了可见元素的位置和大小.
收集界面有3种类型的可见元素用来安放:
cells 是被排版定位的主要元素,每个单元代表了收藏界面中的一个独立的数据源,收藏界面可以把这些单元分成一组或多组.排版类的主要作用就是在收藏界面的内容区域布置这些单元.
Supplementary views 展示不同于单元格的数据.它不能被用户选中.它为每组数据或整个收藏界面提供头部或尾部.补充界面是可选的,而且它的使用和放置都是由排版类定义的.
Decoration views 是可见的装饰,但不能被选择,不与收藏界面的数据内在绑定.装饰界面是另一种类型的补充界面.它们也是可选的,由排版类定义使用和位置.
收藏界面会很多次地向它的排版类询问排版信息.每个单元和界面显示在屏幕中的时候,会使用排版类中的位置信息.相似的,当收藏界面的单位每次被插入或删除时,这些被添加或删除的单位会发生额外的排版.无论如何,收藏界面仅限于排版在屏幕中显示的对象.
重写方法
每个排版类都要实现下面这些方法:
layoutAttributesForElements(in:)
layoutAttributesForSupplementaryView(ofKind:at:)(如果支持补充界面)
layoutAttributesForDecorationView(ofKind:at:)如果支持装饰界面)
shouldInvalidateLayout(forBoundsChange:)
这些方法提供了收藏界面显示内容所需要的基本排版信息,当然,如果你的排版不支持补充界面或装饰界面,就可以不实现相关的方法.
当收藏界面的数据发生改变并且它的单位发生插入或删除时,收藏界面会让排版类更新排版信息.特别是,每个单位被移动 删除 添加时,它的排版信息更新必须反映单位新的位置.对于移动的单位,收藏界面通过标准的方法来取回单位更新后的排版属性.对于插入或删除的单位,收藏界面会调用不同的方法:
initialLayoutAttributesForAppearingItem(at:)
initialLayoutAttributesForAppearingSupplementaryElement(ofKind:at:)
initialLayoutAttributesForAppearingDecorationElement(ofKind:at:)
finalLayoutAttributesForDisappearingItem(at:)
finalLayoutAttributesForDisappearingSupplementaryElement(ofKind:at:)
finalLayoutAttributesForDisappearingDecorationElement(ofKind:at:)
另外,也可以重写prepare(forCollectionViewUpdates:)来处理排版相关的准备工作.也可以重写finalizeCollectionViewUpdates()来添加动画或实现排版结束阶段时相关的排版工作.
话题
初始化
获得收藏界面
var collectionView: UICollectionView?
var collectionViewContentSize: CGSize
返回收藏界面的内容宽高.
提供排版属性
class var layoutAttributesClass: AnyClass
func layoutAttributesForElements(in: CGRect)
func layoutAttributesForItem(at: IndexPath)
func layoutAttributesForInteractivelyMovingItem(at: IndexPath,withTargetPosition: CGPoint)
返回正在被用户移动的单位的排版属性.
func layoutAttributesForSupplementaryView(ofKind: String,at: IndexPath)
网友评论