自定义简单的UICollectionView

作者: CyrusCao | 来源:发表于2016-06-30 22:01 被阅读305次

    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 就完成啦。

    相关文章

      网友评论

        本文标题:自定义简单的UICollectionView

        本文链接:https://www.haomeiwen.com/subject/pgdfjttx.html