UICollectionView的使用(一)

在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的布局信息。其主要属性有
UICollectionViewFlowLayout的属性

itemSize:每个item的大小,item类似Cell。
UICollectionViewScrollDirection :滚动方向(水平或垂直),默认垂直滚动
sectionInset:每个section与周边的间距,一个section包含1个或多个item,类似于tableview的section
minimumLineSpacing:行与行之间间距(垂直滚动),或(水平滚动)列与列之间间距
minimumInteritemSpacing:当一行或一列有多个item时,item之间的距离。如垂直滚动时,每行有多个item,每行的item之间间距

Vertical.png
图为垂直滚动的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的属性设置。如果需要特殊设置(瀑布流等),就可以遵守该协议,使用协议的方式来对每个对象进行布局。主要方法如下

DelegateFlowLayout
方法和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的选中和取消选中操作。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值