创建集合视图
与表格一样,集合视图也有两种用法,一种是直接使用集合视图,另一种是使用系统预置的控制器。开发者可以构建一份单独的集合视图实例,并把它添加到界面中,也可以使用更为方便的UICollectionViewController对象,该对象是个预先制备好的视图控制器,其中带有一份集合视图。这个控制器会自动把视图的数据源及委托设置成该控制器本身,而且还会宣称自己遵从两个相关的协议。这样的集合视图控制器既可以用作其他容器(比如导航控制器、标签栏控制器、分栏视图控制器、页面视图控制器等)的子控制器,也可以独立展示出来。
1、通过控制器使用集合视图
构建控制器的时候,首先要创建并设置好布局对象,然后分配的实例,并用准备好的布局对象初始化它:
UICollectionViewFlowLayout *layout = [[UICollectionViewFlowLayout alloc] init];
layout.scrollDirection = UICollectionViewScrollDirectionVertical;
MyCollectionViewController *mcc = [[MyCollectionViewController alloc] initWithCollectionViewLayout:layout];
上面的代码采用UICollectionViewFlowLayout类就行了。集合视图里的许多布局任务,他都能够完成。我们可以用它构建出基本的界面。在默认的状态下,每个区段都会根据屏幕内容自行调整该区段中的条目,而开发者则可以指定区段之间、线条之间以及条目之间的空白尺寸等。
UICollectionViewFlowLayout类的父类叫做UICollectionViewLayout,它是个可供继承的抽象类,不过,绝大部分情况下都不应该从它继承子类,而是应该从UICollectionViewFlowLayout继承,开发者并不需要直接使用这个父类。
2、直接使用集合视图
如果想建立嵌入其他视图之中的集合视图,就先创建好布局对象,然后布局对象来创建集合视图,并设置数据源及委托。UICollectionViewFlowLayout对象会使用开发者经由delegate属性赋给集合视图的委托:
UICollectionViewFlowLayout *layout = [[UICollectionViewFlowLayout alloc] init];
layout.scrollDirection = UICollectionViewScrollDirectionVertical;
UICollectionView *collectionView = [[UICollectionView alloc] initWithFrame:CGRectZero collectionViewLayout:layout];
collectionView.delegate = self;
collectionView.dataSource = self;
3、数据源与委托
管理集合视图的视图控制器宣称自己实现了UICollectionViewDataSource及UICollectionViewDelegate协议。但与表格不同的是,如果使用流式布局,那么控制器还会宣称自己实现了UICollectionViewDelegateFlowLayout协议。
UICollectionViewDelegateFlowLayout协议通过一系列回调方法来给集合视图的布局对象提供布局信息。集合视图的delegate遵从了这一协议,也就是说,我们无须另外用一个名为delegateFlowLayout的属性来表示实现了该协议的对象。
与表格视图一样,数据源也负责提供每个区段及区段内每个条目的信息,并根据需求 返回对应 单元格以及集合视图上面的其他部件。委托负责处理用户的操作,并对用户的改动请求作出有效的回应。而
UICollectionViewDelegateFlowLayout则负责提供每个区段的详细布局信息,在大多数情况下,它所规定的方法都是可选的。流式布局具体看下一个博客。