collection View的三个逻辑组成部分:数据、子视图、布局。
一、collectionView和tableView的比较
1. 和tableView的共同点:
(1)都继承scrollView
(2)都需要两个代理:delegate和dataSourceDelegate
(3)都按分区(section)和单元格(cell)对子视图进行管理
(4)都有重用机制,每次从重用池中取出一个cell都会执行对应类的layoutSubviews方法。执行这个方法的时候,已经更新了cell的大小,但不会更新cell的contentView的大小。不论对于cell还是cell的contentView,默认frame的大小和bounds的大小都是一样的。
2. 和tableView的不同点:
tableView | collectionView | |
---|---|---|
(1)初始化 | tableView初始化的时候需要指定表格的style; | collectionView初始化的时候需要指定一个布局类的对象。 |
(2)管理子视图布局 | tableView按行来管理子视图,一行对应一个cell。布局只涉及行高; | collectionView子视图可以不受行和列的约束自由分布,一个item对应一个cell。由布局类UICollectionViewLayout类来指定视图的位置。 |
(3)重用机制 | tableView的重用机制是针对cell的,且不是强制的,即某种cell类型可以在未注册的情况下使用; | collectionView的重用机制面向所有子视图,包括section、cell、装饰性的子视图,且是强制的,所有用到的cell类型和section类型都需要注册之后才可以使用。 |
(4)重用机制调用的初始化方法 | 在tableView的重用机制里,对于注册了的类,会在需要创建该类的对象的时候自动调用该类的initWithStyle:reuseIdentifier:方法; | 在collectionView的重用机制里,对于注册了的类,会在需要该类的对象的时候自动调用该类的initWithFrame:方法。 |
二、collectionView的布局
由于已经学过tableView,类似的collectionView的协议方法都能明白。因此这里把重点放在item的布局上。
(1)collectionView何时需要布局:
collectionView加载的时候,在增删、移动子视图的时候会需要布局信息。
(2)collectionView如何指定布局样式
collectionView在初始化的时候就指定了collectionViewLayout对象。选择不同的布局方法,也就是给collectionView指定不同的col