以前用CollectionViewController只是皮毛,一些iOS从入门到精通的书上也是泛泛而谈。这几天好好的搞了搞苹果的开发文档上CollectionViewController的内容,亲身体验了一下CollectionViewController的强大,以前一直认为CollectionView和TableView用法差很少,功能应该也是相似的。TableView的功能就已经很强大了,,CollectionView就是TableView的升级版,其功能更为强大。之后的几篇博客中好好的研究一下CollectionView,由浅入深,层层深刻,搞透CollectionView这个强大的组件。在一些开源社区上分享的效果比较炫的代码,有很多是使用UICollectionView作的,UICollectionViewController是很实用的,颇有必要好好的搞一下。html
一. CollectionViewController简介ios
UICollectionViewController说白了就是一个UIViewController + UICollectionView = UICollectionViewController。 这一点和UITableViewController是同样同样的。编程
1.继承关系app
由上图可知,UICollectionViewController的父亲(父类)是UIViewController, 而UIViewController的父亲是UIResponder,UIResponder继承自NSObject。这个继承关系和UITableViewController是同样同样的, 也就是说UICollectionViewController和UITableViewController是兄弟或者姐妹关系。这样比的话他俩就亲近多了。布局
2.遵循的一些协议spa
这些协议也和UITableViewController遵循的协议相似,经常使用的仍是UICollectionViewDataSource(数据源)和UICollectionViewDelegate(委托代理), 上面这两个经常使用的协议就很少说了和UITableViewController的用法相似。代理
UITraitEnvironment 是iOS8之后才引入的新的协议接口,它和Size Class有关,这个类封装了像水平和竖直方向的Size Class等信息,iOS8的UIKit中大多数UI的基础类(包括UIScreen, UIWindow, UIViewController, UIPresentationController 和 UIView)都实现了UITraitEnvironment
这个接口,能够经过这个接口来作一些控件显示,屏幕适配等一些工做。code
UIContentContainer 是iOS8以后添加的新的协议,也是和Size Class相关的协议。该协议中的方法能够帮助你适配视图控制器上的内容,好比内容尺寸和位置等。htm
UIViewController 和 UIPresentationController(iOS8的新特性,在这儿不作过多介绍)’象为该协议提供默认的实现方法。当建立自定义视图控制器或者展现控制器时,你能够重写默认的实现方法来调整你视图控制器的内容。例如,你可使用该方法来调整子视图控制器的大小或位置。对象
由上面可知UICollectionViewController是iOS6之后推出的东西,相对起来仍是比较新的。
二. UICollectionViewController的实现行为
1. 若是你的集合视图控制器与nib文件或者Storyboard进行了绑定,那么他的视图将会从nib文件或者Storybaord中进行加载。若是你是使用编程的方式来建立集合视图控制器,那么将会自动建立一个已经配置好的collection view, 而这个collection view能够经过 collectionView来进行访问。
2.当从nib文件或者Storyboard中加载集合视图时,集合视图的数据源(Data source)和代理对象(Delegate Object)是从nib或者Storyboard中获取的。若是data source 或者 delegate没有被指定的话,collection view将会自动赋值一个未知的对象。
3.当集合视图首次出现时会从新加载上面的数据。当视图每次显示时,也会清除当前的选择。不过你能够把属性 clearsSelectionOnViewWillAppear设置成NO来改变这种行为。
你能够建立一个自定义的UICollectionViewController子类来管理你的集合视图。当你初始化视图控制器时,你可使用initWithCollectionViewLayout:方法来指定集合视图想要使用的布局方式。由于刚建立集合视图是没有尺寸或者内容的,data source和delegate是一个典型集合视图中所必须的信息。
你能够重写loadView或者其余超类中的方法,可是若是你这样作, 你必须确保在你实现的方法中使用super调用了超类中相应的方法。若是你没有这么作,集合控制器有可能没有执行全部须要执行的任务来保证集合视图的完整。
三.简单集合视图控制器建立
1.初始化UICollectionViewController对象
使用initWithCollectionViewLayout: 方法来初始化UICollectionViewController的对象,该方法能够初始化和根据提供的布局来配置集合视图。布局会控制集合视图上的单元格(Cell)的排列方式。默认的是Flow Layout.
2. 使用Storyboard建立一个CollectionViewController
(1) 从控件库中拖拽出Collection View Controller ,你能够在Cell上添加一个ImageView, 而且添加上图片,这样看起来也漂亮一些。你也能够给Cell设置一个背景色便于区分。
(2) 设定Cell的默认宽高,具体以下图所示
(3) 设定Cell的重用标示符为"Cell"这个咱们要在代码中使用
(4) 给集合视图控制器关联代码,并设置Storyboard ID
3.在代码中实现相应的代理,和TableView很是相似
(1) 返回Section个数的方法
- (NSInteger)numberOfSectionsInCollectionView:(UICollectionView *)collectionView { return 1; }
(2) 返回每一个Section中Cell个数的方法
- (NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section { return 30; }
(3) 经过Cell重用标示符来选择和重用Cell
1 - (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath { 2 UICollectionViewCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:reuseIdentifier forIndexPath:indexPath]; 3 4 // Configure the cell 5 6 return cell; 7 }
经过上面的步骤一个简单CollectionView就能够运行起来了,最终运行效果以下所示:
今天这篇博客的内容算开个头,后边回由浅入深,慢慢更新博客。今天就是一个Ready的过程,下篇博客将会基于今天这个工程介绍其余的关于UICollectionView的东西,如UICollectionViewLayout等,来逐渐领略UICollectionViewController的魅力。