UICollectionView 是强力版的 UITableView,它的亮点在于可以将数据元素按照我们自定义的方式来呈现出来,甚至连布局都可以是动态的。
使用
第一步:创建一个自定义的cell
创建一个 Cocoa Touch 类,继承 UICollectionViewCell。 我们用这个类来管理自定义的显示单位,这里使用一个文字标签和一个图片作为样例,构造函数略,别忘了加上一些 constrain。
class MyCell: UICollectionViewCell {
var label: UILabel!
var imageView: UIImageView!
override init(frame: CGRect){
// initialization
}
}
第二步:在 ViewController 中实现协议
Swift 语言面向协议编程,CollectionView 具有的强大功能都是通过实现各种功能协议来完成的,这也是 iOS 程序的主流设计框架。
千里之行,始于足下。第二步我们首先来实现一个具备最基本功能的 UICollectionView:
首先要在 ViewController 中实现 UICollectionViewDataSource 协议,来为集合视图提供数据。并且创建一个 UICollectionView 实例。
class MyViewController: UIViewController, UICollectionViewDataSource {
override func viewDidLoad() {
super.viewDidLoad()
// 创建一个布局方式
let collectionLayout = UICollectionViewFlowLayout()
// 为布局方式设置滚动方向
collectionLayout.scrollDirection = .Horizontal
// 创建一个 UICollectionView 实例
var collectionView = UICollectionView(frame: view.frame, collectionViewLayout: collectionLayout)
// 为 CollectionView 设置 cell 的类,并且指定 Identifier
collectionView.registerClass(MyCell.self, forCellWithReuseIdentifier: "MyCell")
// 设置 Controller 为数据源
collectionView.dataSource = self
}
}
UICollectionView 的创建必须依赖于一个布局对象,可选的值有流线型布局和转场式布局,典型的转场式布局就是翻页效果或者轮播效果。
第三步:实现协议中的方法
在 UICollectionViewDataSource 协议中有两个必须实现的方法:
func collectionView(collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
return 6 // 需要显示的数量
}
此方法中返回一个 Int 类型值,用来限制单元格的数量
func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell {
let cell = collectionView.dequeueReusableCellWithReuseIdentifier("MyCell", forIndexPath: indexPath) as! MyCell
cell.backgroundColor = UIColor.blueColor();
cell.label.text = "BlaBlaBla";
cell.imageView.image = UIImage(); // some image
return cell;
}
此方法旨在根据指定的 Identifier 来创建可以复用的 cell,cell 的初始化方法会在这里被执行。对 cell 中的一些属性进行设置,而不是在 cell 的构造器中。
此时,一个基本的 CollectionView 就成型了。
第四步:提供数据
首先创建两个数组为 CollectionView 提供数据:
let names = ["Jack", "Jobs", "Joy", "Ray"]
let images = [UIImage(name: "1.png"), UIImage(name: "2.png"), UIImage(name: "3.png"), UIImage(name: "4.png")]
然后我们只需要在第三步中的 cell 复用方法里为每个 cell 设置数据源就可以了:
func collectionView(collectionView: UICollectionView,
cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell {
let cell = collectionView.dequeueReusableCellWithReuseIdentifier(
"MyCell", forIndexPath: indexPath) as! MyCell
cell.backgroundColor = UIColor.blueColor()
cell.label.text = names[indexPath.item]
cell.imageView.image = images[indexPath.item]
return cell
}
indexPath.item 相当于 cell 的索引。
设置单元格大小
CollectionView 的功能基本都要靠实现协议来实现,首先要实现 UICollectionViewDelegateFlowLayout 协议中的方法:
class MyViewController: UIViewController, UICollectionViewDataSource,
UICollectionViewDelegateFlowLayout {
}
然后实现一个设置单元格大小的方法:
func collectionView(collectionView: UICollectionView,
layout collectionViewLayout: UICollectionViewLayout,
sizeForItemAtIndexPath indexPath: NSIndexPath) -> CGSize {
return CGSizeMake(80, 80)
}
这样,一个简单的 CollectionView 就完成啦。
网友评论