Write in the first【写在最前】
UITableView 熟悉吧, UICollectionView 必须熟悉吧。
在WWDC2012中的Introducing Collection Views,苹果首次介绍了UICollectionView,类似UITableView的用法使人很容易接受,但强大的自定义布局,又使其相较于UITableView有了选择它的更多理由,UITableView中的表格只支持单排列表,没有办法支持网格列表模式,CollectionView有着灵活的布局特性,这一点充分说明我们在学会UITableView的基础上,再去学习推敲CollectionView的必要性。
本篇文章主要从【UICollectionView 系统文件注解】学习总结。
在「时间 & 知识 」有限内,总结的文章难免有「未全、不足 」的地方,还望各位好友指出,以提高文章质量。
目录:
- UICollectionView概念
- UICollectionView基本组成
- UICollectionView层次结构
1.UICollectionView 继承于 UIScrollView
2.UICollectionViewDataSource数据源
3.UICollectionViewDelegate代理
4.UICollectionViewLayout自定义布局对象
5.UICollectionViewFlowLayout布局对象(默认)
6.UICollectionViewCell样式
7.UICollectionViewLayoutAttributes布局属性- UICollectionView与UITableView比较
- UICollectionView使用说明
- UICollectionView基本使用
- 自定义FlowLayout:水平滚动相册
- UICollectionView效果图
- 自定义FlowLayout:瀑布流
- UICollectionView.h 属性&方法
UICollectionView概念
本着好好学习,了解权威的目的,我们还是主动看官网的说明。

上图释义:管理有序的数据项集合和使用自定制的布局。
通俗点就是:UICollectionView 是一种新的数据展示方式,简单来说可以把他理解成多列的UITableView,可以做九宫格布局的一种view;
UICollectionView基本组成

注解:如上图:你看到的就是一个最简单的UICollectionView,它包含:Cells、Supplementary Views、Decoration Views。
Cells:用于展示内容的主体,
cell的尺寸和内容可以各不相同。Supplementary Views:追加视图,类似于
UITableView每个Seciton的Header View或者Footer View,用来标记Section的View。Decoration Views:装饰视图,完全跟数据没有关系的视图,负责给
cell或者supplementary Views添加辅助视图用的,灵活性较强。不管多么复杂的
UIcollectionView都是由着三个部件组成的。
UICollectionView层次结构

注解:
1、UICollectionView 继承于 UIScrollView
|
|
2、UICollectionViewDataSource:主要管理视图数据源方面,告诉view要显示些什么东西以及如何显示它们。
@required(必须)
|
|
@optional(可选)
|
|
3、UICollectionViewDelegate:主要管理于用户交互方面,提供一些样式的小细节。
@optional(可选)
|
|
事件的处理顺序如下:
1、手指按下:
shouldHighlightItemAtIndexPath(如果返回YES则向下执行,否则执行到这里为止)。2、
didHighlightItemAtIndexPath(高亮)。3、手指松开:
didUnhighlightItemAtIndexPath(取消高亮)。4、
shouldSelectItemAtIndexPath(如果返回YES则向下执行,否则执行到这里为止)。5、
didSelectItemAtIndexPath(执行选择事件)。
选中 和 取消选中
item时 ,会触发的方法
|
|
- 补充视图(头部或尾部视图),显示 和 移除
|
|
- 长按某
item,弹出copy(复制)和paste(粘贴)的菜单相关。
|
|
- 注册类型相关
|
|
- 复用队列
|
|
- 动态修改当前的Item 和 Section
|
|
- 其它属性 和 方法相关
|
|
4、UICollectionViewLayout:自定义布局,它负责了将各个cell、Supplementary View和Decoration Views进行组织。
UICollectionViewLayout 是UICollectionView特有的,是UICollectionView的精髓所在,它负责将每个cell、supplementary view、decoration view进行组合,为它们设置各自的属性,包括:位置、大小、透明度、层级关系、形状等。UICollectionViewLayout决定了,UICollectionView是如何显示在界面上,从UICollectionView初始化必须要一个UICollectionViewLayout也可以看得出来,Layout对于UICollectionView的最要性。
自定义布局:只要了解5个方法(重写它方法,扩展功能)
|
|
5、UICollectionViewFlowLayout:主要管理布局信息方面,Apple为我们提供了一个最简单可能也是最常用的默认layout对象,UICollectionViewFlowLayout。Flow Layout简单说是一个直线对齐的layout。
- 我们来了解
UICollectionViewFlowLayout它内部常用的属性:
|
|
- 上面对
FlowLayout的属性设置,当然代理方法中也有一一对应,UICollectionViewDelegateFlowLayout常用方法:
|
|
UIEdgeInsets sectionInset 内边距
6、UICollectionViewCell:相对于UItableViewCell而言,UIcollectionViewCell没有那么多样式。UIcollectionViewCell不存在所谓的style,也没有titleLabel和内置的imageView属性,UIcollectionViewCell的结构上相对比较简单。
cell:本身作为的View,这里应该就是UICollectionReusableViewbackgroundView:用作cell背景的视图,设置背景图片等。selectedBackgroundView:cell被选中的背景视图contentView:内容视图,自定义的cell时应该将内容放在这个View上补充:
UIcollectionView有一个小细节:被选中的cell的自动变化,所有的cell中的子View,也包括contentView中的子View,当cell被选中是,会自动去查找view是否有被选中状态下的改变,如果在contentView中有一个imageView的selected和normal状态下的图片是不同的,那么选中cell这张图片也会从normal变成selected,不需要添加代码。
7、UICollectionViewLayoutAttributes 布局属性:
在了解这个类之前,我们得先疏通一下,UIcollectionView的布局方式,首先我们之前一直提,UIcollectionView的初始化必须有一个UICollectionViewLayout,也就是我们说的,必须要有一个布局格式样式,
那么一个UIcollectionView有那么多的cell、supplementary View、decoration View,UIcollectionViewLayout是如何进行布局显示的呢?
原来从UIcollectionViewLayout开始加载内容的时候,便默默的做了很多事:首先是去调用 prepareLayout 准备布局,然后根据当前屏幕所处位置的合适rect,得到每一个视图的UICollectionViewLayoutAttributes属性,然后在把视图按UICollectionViewLayoutAttributes中的属性描述设置视图具体的center、size等等,期间也会去调用其他方法去确定一些间距。所以UICollectionViewLayoutAttributes是每个视图决定性的布局的属性。
|
|
UICollectionView与UITableView比较
相同点:
都需要遵守
DataSource和Delegate,实现协议方法。待补充
不同点:
- 与
UITableView的最大不同,布局交给了指定的UICollectionViewLayout布局对象。
UICollectionView的cell使用必须先注册,使用出列的方式。UICollectionView:Supplementary补充视图需要先注册(这里可以充当区的头和尾)。待补充
- 与
UICollectionView 使用说明
说明:代码不重要,重要的是思维
创建
UICollectionView必须要有布局参数flowLayout;(采用懒加载)UICollectionViewFlowLayout *layout = [[UICollectionViewFlowLayout alloc] init];cell必须通过注册;registerClass: forCellWithReuseIdentifier:自定义
Cell,原因:系统cell没有任何子控件;(添加子控件image,label)。@interface LNPhotoViewCell : UICollectionViewCellFlowLayout自定义(调整cell尺寸,利用布局就做效果),原因:系统cell中每个item尺寸都一样;(继承flowLayout或Layout)。@interface LNFlowLayout : UICollectionViewFlowLayout自定义布局: 只要了解5个方法(重写它方法,扩展功能)
|
|
UICollectionView基本使用
初始化
|
|
注册UICollectionView使用的cell类型
|
|
实现协议UICollectionViewDataSource
|
|
|
|
实现代理UICollectionViewDelegate
|
|
|
|
|
|
布局对象UICollectionViewDelegateFlowLayout
|
|

自定义FlowLayout:水平滚动相册

核心代码如下:
|
|
附图:
期待
- 如果在阅读过程中遇到 error || new ideas,希望你能 messages 我,我会及时改正谢谢。
- 点击右上角的 喜欢 和 订阅Rss 按钮,可以收藏本仓库,并在 Demo 更新时收到邮件通知。