在iOS开发中,与列表展示相关的,更多的是使用UITableView,几乎每个App都离不开它。对比与UITableView,UICollectionView的使用比较繁琐,所以UICollectionView的使用不是很常见。但UICollectionView也有自身的特点,比如横向布局,多行或者多列(瀑布流)展示。Apple也推荐了一些应用UICollectionView典型场景:相册、书库。
1.UICollectionView的布局
与UITableView类似,UICollectionView也可以通过控件的形式创建,其展示的UICollectionViewCell也可以是XIB的形式,这里更好的理解,使用代码创建。
- (instancetype)initWithFrame:(CGRect)frame collectionViewLayout:(UICollectionViewLayout *)layout
UICollectionView的创建过程基本和UITableView类似,设置dataSource代理和delegate代理。不同于UITableView初始化时一般要指定UITableViewStyle,UICollectionView初始化时指定的是UICollectionViewLayout对象(一般都是使用它的子类UICollectionViewFlowLayout)。这个对象保存了关于UICollectionView的布局信息。其主要属性有
itemSize:每个item的大小,item类似Cell。
UICollectionViewScrollDirection :滚动方向(水平或垂直),默认垂直滚动
sectionInset:每个section与周边的间距,一个section包含1个或多个item,类似于tableview的section
minimumLineSpacing:行与行之间间距(垂直滚动),或(水平滚动)列与列之间间距
minimumInteritemSpacing:当一行或一列有多个item时,item之间的距离。如垂直滚动时,每行有多个item,每行的item之间间距
图为垂直滚动的UICollectionView
解释一下含义
itemSize 即一个Item的大小,灰色背景的大小, 默认(50.0, 50.0)
minimumLineSpacing 即红线间距,默认是10
minimumInteritemSpacing 黄线间距,默认是10
minimumLineSpacing、minimumInteritemSpacing、itemSize和sectionInset组成个整个布局。但minimumInteritemSpacing的优先级较低。如在375宽度的iPhone6上,垂直滚动方向,itemSize为(150,150),sectionInset为(0, 20, 10, 20),minimumLineSpacing为30。只要minimumInteritemSpacing的设置不超过35,屏幕都是2列的,同时minimumInteritemSpacing的大小固定是35(实际上我们设置的是一个不大于35的值)。如果将其设置为大于35,如36,那么一行将放不下2个item,因为20+20+150*2+36>375,也就是说minimumInteritemSpacing在布局时是最后考虑的。
2.代理协议
代理协议有3个
UICollectionViewDelegateFlowLayout
UICollectionViewDelegate
UICollectionViewDataSource
UICollectionViewDelegateFlowLayout协议是用来布局的,对应于UICollectionViewFlowLayout的属性设置。如果需要特殊设置(瀑布流等),就可以遵守该协议,使用协议的方式来对每个对象进行布局。主要方法如下
方法和UICollectionViewFlowLayout的属性是对应的。不过这种方式更灵活,而通过属性设置是一成不变的。
UICollectionViewDataSource协议与UITaleViewDataSource协议类似,常用协议如下
- (NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section;
- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath;
- (NSInteger)numberOfSectionsInCollectionView:(UICollectionView *)collectionView;
分别对应Section多少个Item,展示的UICollectionViewCell和UICollectionView多少个Section。
CollectionView也使用了重用机制,可以
- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath;
自行判断为空后再创建Cell,或者用
- (void)registerClass:(nullable Class)cellClass forCellWithReuseIdentifier:(NSString *)identifier;
来注册Cell。
UICollectionViewDelegate协议与UITaleViewDelegate协议类似,常用协议如下
- (void)collectionView:(UICollectionView *)collectionView didSelectItemAtIndexPath:(NSIndexPath *)indexPath;
- (void)collectionView:(UICollectionView *)collectionView didDeselectItemAtIndexPath:(NSIndexPath *)indexPath;
分别对应Item的选中和取消选中操作。