0. 简介

  参考:支持重排的iOS9 UICollectionView

  参考:http://www.cnblogs.com/langtianya/p/3902801.html

  参考:http://www.cnblogs.com/ios8/p/iOS-UICollectionView.html

  UIICollectionView 必须实现UICollectionDataSource、UICollectionViewDelegate、UICollectionViewDelegateFlowLayout这三个协议。

0.1. 相似控件

   UICollectionView, UITableView, NSCollectionView

0.2. UICollectionView的优势

  • 高度定制内容
  • 优秀的管理数据的能力
  • 高效处理大量数据

0.3. 构成

0.3.1. 单元格

  Cells,主要的显示视图。

0.3.2. 补充View

  Supplementary Views,页眉页脚。

0.3.3. 装饰View

  Decoration Views,背景效果。

1. 常用协议

1.1. Section的个数

-(NSInteger)numberOfSectionsInCollectionView:(UICollectionView *)collectionView

1.2. 每个Section里Item的个数

-(NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section

1.3. 每个UICollectionViewCell展示的内容

-(UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath {

    static NSString * CellIdentifier = @"GradientCell";

    UICollectionViewCell * cell = [collectionView dequeueReusableCellWithReuseIdentifier:CellIdentifier forIndexPath:indexPath];

    cell.backgroundColor = [UIColor colorWithRed:(( * indexPath.row) / 255.0) green:(( * indexPath.row)/255.0) blue:(( * indexPath.row)/255.0) alpha:1.0f];

    return cell;

  }

1.4. 每个UICollectionViewCell的大小

- (CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout*)collectionViewLayout sizeForItemAtIndexPath:(NSIndexPath *)indexPath {
return CGSizeMake(, );
}

1.5. 每个UICollectionView Section的margin

-(UIEdgeInsets)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout *)collectionViewLayout insetForSectionAtIndex:(NSInteger)section  {
return UIEdgeInsetsMake(, , , );
}

1.6. UICollectionViewCell选中时

//UICollectionView被选中时调用的方法
-(void)collectionView:(UICollectionView *)collectionView didSelectItemAtIndexPath:(NSIndexPath *)indexPath {
UICollectionViewCell * cell = (UICollectionViewCell *)[collectionView cellForItemAtIndexPath:indexPath];
cell.backgroundColor = [UIColor whiteColor];
}

1.7. UICollectionView是否可以被选中

-(BOOL)collectionView:(UICollectionView *)collectionView shouldSelectItemAtIndexPath:(NSIndexPath *)indexPath  {
return YES;
}

2. 重用

2.1. 注册Cell类

- (void)registerClass:forCellWithReuseIdentifier:

- (void)registerClass:forSupplementaryViewOfKind:withReuseIdentifier:

- (void)registerNib:forCellWithReuseIdentifier:

- (void)registerNib:forSupplementaryViewOfKind:withReuseIdentifier:

2.2. 从队列取出Cell

-(id)dequeueReusableCellWithReuseIdentifier:forIndexPath:

-(id)dequeueReusableSupplementaryViewOfKind:withReuseIdentifier:forIndexPath:

2.3.1. 示例代码

2.3.1.1. 注册

  在CollectionView类中注册Cell类:

[collectionView registerClass:[MyCellclass] forCellWithReuseIdentifier:@”MY_CELL_ID”]

2.3.1.2. 使用Cell

  取出后直接使用即可,不需要再进行空值判断和初始化:

-(UICollectionView*)collectionView:(UICollectionView*)cv cellForItemAtIndexPath:(NSIndexPath*)indexPath{

MyCell *cell =[cv dequeueReusableCellWithReuseIdentifier:@”MY_CELL_ID”];

//if (!cell) { //Well, nothingreally. Never again}

// Configure thecell's content
cell.imageView.image= ... return cell; }

3. 内容显示

  UICollectionView继承自UIScrollView,UICollectionView通过UICollectionViewLayout和UICollectionViewFlowLayout对cell和其它view进行布局。

  UICollectionViewCell由三部分组成:

  • Background View
  • Selected Background View
  • Content View

3.1. UICollectionViewLayout

3.1.1. 使用自定义的Layout(UICollectionViewLayout)

  这是一个抽象基类,需要继承自它,来为collection view 生成layout信息。Layout对象的作用是决定cells、Supplementary views和 Decorationviews在collection view中的布局。需要计算这些view的layout属性。

3.1.2. 使用系统Layout(UICollectionViewLayoutAttributes)

  主要包含:

  • 位置
  • 大小
  • 透明度
  • ZIndex
  • 转场

3.2. Flow Layout

3.2.1. 核心概念

  UICollectionViewFlowLayout是一个具体的layout对象,用来把Items布局在网格中,并且可选页眉和页脚。在collection view中的Items,可以从一行或一列flow至下一行或下一列(行或列取决于滚动的方向)。每行都会根据情况,包含尽可能多的Cells。Cells可以是相同的尺寸,也可以是不同的尺寸。下面是FlowLayout的一些特性:

  • 面向线性布局
  • 可配置为网格
  • 一组lines
  • 具有页眉和页脚

3.2.2. 自定义 Flow Layout

  Flow Layout可以定制的主要功能如下:

  • Item size
  • Line spacing
  • Inter cell spacing
  • Scrolling direction
  • Header and forter size
  • Section inset

  几乎所有的定制属性都是在UICollectionViewFlowLayout中,delegate实际上是collection view 的delegate.UICollectionViewDelegateFlowLayout只是对UICollectionViewDelegate进行了一些扩展。

3.2.2.1. Item size(每个Item的大小)
3.2.2.1.1. 在全局中配置
@property(CGSize)itemSize

layout.itemSize= CGSizeMake(,);
3.2.2.1.2. 通过delegate对每个item进行配置
collectionView:layout:sizeForItemAtIndexPath:
{ return...; }
3.2.2.2. Line spacing(每行的间距)
3.2.2.2.1. 在全局中配置
@property(CGFloat) minimumLineSpacing
3.2.2.2.2. 通过delegate对每个Section进行配置
ollectionView:layout:minimumLineSpacingForSectionAtIndex:
3.2.2.3. Inter cell spacing(每行内部cell item的间距)
3.2.2.3.1. 在全局中配置
@property(CGFloat) minimumInteritemSpacing
3.2.2.3.2. 通过delegate对每个section进行配置
collectionView:layout:minimumInteritemSpacingForSectionAtIndex:
3.2.2.4. Scrolling direction(滚动方向)

  设置scrollDirection属性即可。两个值如下:UICollectionViewScrollDirectionVertical和UICollectionViewScrollDirectionHorizontal。即纵向或横向。

3.2.2.5. Header and footer size(页眉和页脚大小)

  页眉和页脚,即UICollectionElementKindSectionHeader和UICollectionElementKindSectionFooter,通过数据源方法提供内容:

-collectionView:viewForSupplementaryElementOfKind:atIndexPath:

  同样需要注册一个类,并从队列中取出view:

- registerClass:forSupplementaryViewOfKind:withReuseIdentifier:

-registerNib:forSupplementaryViewOfKind:withReuseIdentifier:

-dequeueReusableSupplementaryViewOfKind:withReuseIdentifier:forIndexPath:

  页眉和页脚,当垂直的时候,需要设置的是Height,当水平的时候,需要设置的是Width。页眉和页脚的size配置方式如下:

3.2.2.5.1. 在全局中配置
@property(CGSize) headerReferenceSize

@property(CGSize) footerReferenceSize
3.2.2.5.2. 通过delegate对每个item进行配置
collectionView:layout:referenceSizeForHeaderInSection:

collectionView:layout:referenceSizeForFooterInSection:
3.2.2.6. Sections Insets

  通过两个图来看一下什么是Section Insets:

3.2.2.6.1. 在全局中配置
@propertyUIEdgeInsets sectionInset;
3.2.2.6.2. 通过delegate对每个item进行配置
- (UIEdgeInsets)collectionView:layout:insetForSectionAtIndex:

iOS 之UICollectionView 之原理介绍的更多相关文章

  1. iOS 之 UICollectionView

    1. iOS 之 UICollectionView 之 原理介绍 2. iOS 之 UICollectionView 之 开发步骤 之 OC 3. iOS 之 UICollectionView 之 开 ...

  2. 【如何快速的开发一个完整的iOS直播app】(原理篇)

    原文转自:袁峥Seemygo    感谢分享.自我学习 目录 [如何快速的开发一个完整的iOS直播app](原理篇) [如何快速的开发一个完整的iOS直播app](播放篇) [如何快速的开发一个完整的 ...

  3. iOS:app直播---原理篇

    [如何快速的开发一个完整的iOS直播app](原理篇) 转载自简书@袁峥Seemygo:http://www.jianshu.com/p/7b2f1df74420   一.个人见解(直播难与易) 直播 ...

  4. UIContainerView纯代码实现及原理介绍

    UIContainerView纯代码实现及原理介绍 1.1-在StoryBoard中使用UIContainerView 1.2-纯代码使用UIContainerView 1.3-UIContainer ...

  5. [iOS 开发] WebViewJavascriptBridge 从原理到实战 · Shannon's Blog

    前言:iOS 开发中,h5 和原生实现通信有多种方式, JSBridge 就是最常用的一种,各 JSBridge 类库的实现原理大同小异,这篇文章主要是针对当前使用最为广泛的 WebViewJavas ...

  6. 03 Yarn 原理介绍

    Yarn 原理介绍 大纲: Hadoop 架构介绍 YARN 产生的背景 YARN 基础架构及原理   Hadoop的1.X架构的介绍   在1.x中的NameNodes只可能有一个,虽然可以通过Se ...

  7. 04 MapReduce原理介绍

    大数据实战(上) # MapReduce原理介绍 大纲: * Mapreduce介绍 * MapReduce2运行原理 * shuffle及排序    定义 * Mapreduce 最早是由googl ...

  8. iOS app 程序启动原理

    iOS app 程序启动原理 Info.plist: 常见设置     建立一个工程后,会在Supporting files文件夹下看到一个"工程名-Info.plist"的文件, ...

  9. Android Animation学习(一) Property Animation原理介绍和API简介

    Android Animation学习(一) Property Animation介绍 Android Animation Android framework提供了两种动画系统: property a ...

随机推荐

  1. Gson解析数据

    package com.bwie.test;import java.io.BufferedReader;import java.io.IOException;import java.io.InputS ...

  2. windows程序设计(三)

    MFC所有封装类一共200多个,但在MFC的内部技术不只是简单的封装 MFC的内部总共有六大关键技术,架构起了整个MFC的开发平台 一.MFC的六大关键技术包括: a).MFC程序的初始化过程 b). ...

  3. PAT (天梯)L2-004. 这是二叉搜索树吗?

    L2-004. 这是二叉搜索树吗? 时间限制 400 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 陈越 一棵二叉搜索树可被递归地定义为具有下列性质的 ...

  4. Python基础学习1---函数

    Python函数篇 函数是重用的程序选, 他们允许给一块语句一个名称,然后可以在你的程序的任何地方是使用这个名称任意多次地运行这个语句块.这个就被称为 调用  函数.比如内建了很多高效的函数 如len ...

  5. android viewpager 深究

    参考: http://blog.csdn.net/xushuaic/article/details/42638311 GitHub上相关的ViewPager动画的项目 https://github.c ...

  6. IDL 建立影像金字塔

    形成按目录放好的,类似于Google Map Tile的金字塔瓦片Jpg. 1: ; 2: pro tsplit 3: ; 读入Jpeg格式文件 4: szFile = 'e:\test.jpg'; ...

  7. HDU 5722 Jewelry

    矩形面积并. 需要转化一下思路:记录每一个位置的数以及位置. 对数字进行从小到大排序,数字一样的按位置从小到大排. 这样,一样的数就在一起了.连续的相同的x个数就可以构成很多解,这些解对应于二维平面上 ...

  8. (二)、Struts第二天

    (二).Struts第二天 回顾: 问题: 1. Struts2的Action类是单例还是多例? Filter? Servlet? Listener? 2. 介绍struts2框架引入的相关jar包及 ...

  9. Notice: ob_end_clean() [ref.outcontrol]: failed to delete buffer. No buffer to delete

    解决方法一 @ob_end_clean(); 解决方法二 if(ob_get_contents()) ob_end_clean();

  10. Excel相关问题

    Excel默认永远使用最后安装的那个Excel版本打开.但是如果有一个Excel已经启动了,则使用那个Excel打开. 1.打开“开发工具”选项卡2007中:[Excel选项]-[常用]2010中:[ ...