UICollectionView - 使用一

什么是UICollectionView

UICollectionView是一种新的数据展示方式,简单来说可以把他理解成多列的UITableView(请一定注意这是UICollectionView的最最简单的形式)。

最简单的UICollectionView就是一个GridView,可以以多列的方式将数据进行展示。标准的UICollectionView包含三个部分,它们都是UIView的子类:

*  Cells 用于展示内容的主体,对于不同的cell可以指定不同尺寸和不同的内容 
*  Supplementary Views 追加视图 如果你对UITableView比较熟悉的话,可以理解为每个Section的Header或者Footer,用来标记每个section的view
*  Decoration Views 装饰视图 这是每个section的背景,

实现一个简单的UICollectionView

实现一个UICollectionView和实现一个UITableView基本没有什么大区别,它们都同样是datasource和delegate设计模式的:datasource为view提供数据源,告诉view要显示些什么东西以及如何显示它们,delegate提供一些样式的小细节以及用户交互的相应。

* UICollectionViewDataSource

        section的数量  -numberOfSectionsInCollection:
        某个section里有多少个item  -collectionView:numberOfItemsInSection:
        对于某个位置应该显示什么样的cell  -collectionView:cellForItemAtIndexPath:

  实现以上三个委托方法,基本上就可以保证CollectionView工作正常了。 当然,还有提供Supplementary View的方法

     collectionView:viewForSupplementaryElementOfKind:atIndexPath:

   对于Decoration Views,提供方法并不在UICollectionViewDataSource中,而是直接UICollectionViewLayout类中的(因为它仅仅是视图相关,而与数据无关)


* UICollectionViewDelegate

    数据无关的view的外形啊,用户交互啊什么的,由UICollectionViewDelegate来负责:

        cell的高亮
        cell的选中状态
        可以支持长按后的菜单

    关于用户交互,UICollectionView也做了改进。每个cell现在有独立的高亮事件和选中事件的delegate,用户点击cell的时候,现在会按照以下流程向delegate进行询问:

        -collectionView:shouldHighlightItemAtIndexPath: 是否应该高亮?
        -collectionView:didHighlightItemAtIndexPath: 如果1回答为是,那么高亮
        -collectionView:shouldSelectItemAtIndexPath: 无论1结果如何,都询问是否可以被选中?
        -collectionView:didUnhighlightItemAtIndexPath: 如果1回答为是,那么现在取消高亮
        -collectionView:didSelectItemAtIndexPath: 如果3回答为是,那么选中cell

    状态控制要比以前灵活一些,对应的高亮和选中状态分别由highlighted和selected两个属性表示。  


* 关于Cell

    相对于UITableViewCell来说,UICollectionViewCell没有这么多花头。首先UICollectionViewCell不存在各式各样的默认的style,这主要是由于展示对象的性质决定的,因为UICollectionView所用来展示的对象相比UITableView来说要来得灵活,大部分情况下更偏向于图像而非文字,因此需求将会千奇百怪。因此SDK提供给我们的默认的UICollectionViewCell结构上相对比较简单,由下至上:

        首先是cell本身作为容器view
        然后是一个大小自动适应整个cell的backgroundView,用作cell平时的背景
        再其上是selectedBackgroundView,是cell被选中时的背景
        最后是一个contentView,自定义内容应被加在这个view上

这次Apple给我们带来的好康是被选中cell的自动变化,所有的cell中的子view,也包括contentView中的子view,在当cell被选中时,会自动去查找view是否有被选中状态下的改变。比如在contentView里加了一个normal和selected指定了不同图片的imageView,那么选中这个cell的同时这张图片也会从normal变成selected,而不需要额外的任何代码。

文章后面有两个水平比较高的例子 - https://onevcat.com/2012/08/advanced-collection-viewhttps://objccn.io/issue-12-5/)