iOS开发之——UICollectionView的一些坑

引子

UICollectionViewUITableView很类似,都是展示类型重复的元素。大家肯定UITableView已经很熟悉了,感觉UICollectionView肯定so easy!今天我就列举一下我遇到的几个坑吧,看看大家遇见过没,以此为戒咯!

UICollectionView遵守的协议

UITableView中只需遵守UITableViewDataSourceUITableViewDelegate两个协议即可,不过对于UICollectionView来说,需要遵守:
UICollectionViewDataSource:数据源协议,和UITableView类似,也需要返回这三个方法,看名字应该就知道是什么意思了。

  • numberOfSectionsInCollectionView
  • numberOfItemsInSection
  • cellForItemAtIndexPath

UICollectionViewFlowLayout:内容排版协议。

  • sizeForItemAtIndexPath:元素大小;
  • insetForSectionAtIndex:整个元素区域的边距(margin)值;
  • minimumInteritemSpacingForSectionAtIndex:元素间距;
  • minimumLineSpacingForSectionAtIndex:元素行距(列距)。

UICollectionViewDelegate:代理协议。
shouldHighlightItemAtIndexPath:是否高亮,默认为YES;
didHighlightItemAtIndexPath:某个元素高亮;
shouldSelectItemAtIndexPath:是否支持选中,默认为YES;
didSelectItemAtIndexPath:选中某个元素;
shouldDeselectItemAtIndexPath:是否支持反选,默认为YES;这里边我设置成NO,下边反选的代理方法还是会被执行,暂时不清楚为什么。
didDeselectItemAtIndexPath:某个元素反选。

UICollectionView初始化

如果是用纯代码创建的UICollectionView,需要在初始化UICollectionView之前先初始化flowLayout,如下代码:

UICollectionViewFlowLayout *flowLayout = [[UICollectionViewFlowLayout alloc]init];
CGRect collecionViewFrame = CGRectMake(0, 20, 375, 148);
UICollectionView *collectionView =
[[UICollectionView alloc]initWithFrame:collecionViewFrame
collectionViewLayout:flowLayout];

否则会报错:
reason: 'UICollectionView must be initialized with a non-nil layout parameter'
剩下的只需设置UICollectionViewdataSourcedelegate就可以了,和UITableView一样。

自定义UICollectionViewCell

1. 进行注册

首先要先对UICollectionViewcell进行注册,这一步和博客另一篇单元格重用错误类似。但是UICollectionView中这样解决:

[self.collectionView registerClass:[CollectionViewCellTest class]
forCellWithReuseIdentifier:cellIdentifier];

其中,CollectionViewCellTest是自定义cell类的名称,一定要修改,否则接下来的cell无法访问自定义cell中的属性或者方法。如果不是自定义,就写UICollecitonViewCell

2. 不需要判断if(!cell)

UITableView中,重用完cell之后,我们通常会判断cell是否为空,如果为空,就去新建,因为cell的初始化方法有多个,所以就需要进行判断并手动指定。
不过在UICollectionView中,cell的初始化方法只有initWithFrame这一个,如果cell为空的话,系统会自动调用进行创建,所以不需要再去手动判断。进而引申可以知道,如果自定义cell的话,我们就需要复写- (instancetype)initWithFrame