CollectionView的一些注意点

1. 创建collectionView后,需要调用registerClass:forCellWithReuseIdentifier:方法注册cell。这个方法类似于提前load cell到内存中了,所以在cellForItem中只需要重用即可。

2. 创建collectionView时,需要传入一个layout,然后指定layout的滚动方向,还有minimumItemSpacing,minimumLineSpacing。之所以是minimum,是因为。我们可以举个例子:minimumItemSpacing,即一行中cell的间距,而且所有item的间距都是相等的。当你指定一排的cell比较少时,只能拉开cell的间距来适配了,所以才是最小间距。即有可能比这个间距大。

3. 对于minimumItemSpacing和minimumLineSpacing。

如果是竖直方向滚动,那么minimumItemSpacing指代水平方向item的间距,minimumLineSpacing指代竖直方向相邻两行的间距。千万注意minimumLineSpacing不是指两个section的间距。

如果是水平方向滚动,那么minimumItemSpacing指代竖直方向item的间距,minimumLineSpacing指代水平方向相邻两行的间距。
比如要做一个水平的卡片滚动器,设置两个相邻卡片的距离需要设置minimumLineSpacing,而不是minimumItemSpacing,曾经被这个坑了差不多半个小时。

4. 自定义collectionViewCell

collectionViewCell跟tableViewCell不同,在cellForRow中不需要判空。也就是说前者没有可以自定义的初始化方法。那么就只能依赖系统的自定义方法了。而且奇怪的是,我们只能用initWithFrame:方法,而不能用init方法。

这里普及一个知识:当我们自定义一个MyView时,如果在获取这个view时使用[MyView new]或者[[MyView alloc] init]方法时,在MyView.m中,会先调用到initWithFrame:方法,后调用到init方法。但是如果是使用[[MyView alloc] initWithFrame:frame]方法,那么只会调用到initWithFrame:方法,而不会调用到init方法。
所以,我猜想自定义collectionViewCell时,系统在初始化cell时,使用的是上述中的后者。

5. 滚动到指定位置

滚动到指定位置可以使用scrollToItemAtIndexPath: atScrollPosition: animated:方法。其中ScrollPosition可以自定将要滚动到的cell在屏幕中的位置,可以指定:紧贴屏幕上边缘,居中和紧贴屏幕下边缘。当然这是对于竖直滚动方向的,水平滚动就是左中右了。