iOS Swift版 UICollectionView的使用

前言:

Android中的RecyclerView在软件开发已经占到了重要地位。类似地iOS中也有对应的控件–UICollectionView。有一点需要补充的是,网络上其它关于该控件的介绍使用时都没有提到类似RecyclerView的水平方向上的滚动(非九宫格布局),而本文将浅显地说明如何达到这一效果。在开始学习之前需要先要了解关于UICollection、cell、cell子项(cell内部我们要放入的控件)的概念。

一:导入图片到Assets.xcassets文件夹

这里为了方便演示用到了9张相同的图片,文件名称随意,但不要都相同
在这里插入图片描述

二:拖拽UICollectionView至StoryBoard并配置Identifier和Tag

1:拖拽UICollectionView至StoryBoard
在这里插入图片描述
2:在cell内部放入控件,这里以UILabelUIImageView为例(如果cell过小不足以放下控件,可以使cell变大、待放入的控件变小以达到要求)

在这里插入图片描述
3:设置cell的Identifier。如图所示,先点击左侧区域,再点击右侧区域设置。这里的值为String类型且唯一
在这里插入图片描述

4:设置cell子项控件的Tag。这里为方便演示仅设置了UIImageView的tag。如图所示,先单击要设定tag值的控件,再单击右侧"Tag"栏以设定Tag。这里的值为Int且唯一。
在这里插入图片描述

三:实现UICollectionViewDataSource, UICollectionViewDelegate这两个协议

实现完后系统会报错,选择自动修复就行了。之后会多出这两个方法:

func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
    }
    
func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
    }

第一个方法为待返回cell子项的数目,也就是要展示的数目;第二个方法为返回待创建的cell内容和其子项(包括数据源)

四:完成以上两个方法

这里代码有些长,但很简单。首先创建一个数组,里面存放的是一开始提到的资源图片的名称。这里为了演示没有写成泛型,实际上应该写成泛型的。

第二项内容就是上文提到的第一个待实现的方法,这里就返回创建的图片数组的数量。

第三项内容就是上文提到的创建cell内容的方法。这里先创建cell对象,let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "myCell", for: indexPath)这条语句第一个参数就是我们一开始设置cell的Identifier;接着创建label对象。let label = cell.viewWithTag(1002) as! UILabel这条语句通过 viewWithTag我们拿到了cell内部的一个对象,然后强制转型为UILabel类型。下面的UIImageView也是如此,不过多赘述。最后返回一个cell对象。

    var images: Array = ["P1","P2","P3","P4","P5","P6","P7","P8","P9","P10","P11","P12"]
    
    func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
        return images.count
    }
    
    func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
        let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "myCell", for: indexPath)
        
        let label = cell.viewWithTag(1002) as! UILabel
        label.text = "No.\(indexPath.item)"
        
        let imageView = cell.viewWithTag(1001) as! UIImageView
        let imageName = images[(indexPath as NSIndexPath).row]
        
        imageView.image = UIImage(named: imageName)
        
        return cell
    }
    
    func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
        let cell = collectionView.cellForItem(at: indexPath)
        
        print("\(indexPath)")
    }

五:设置代理、数据源

这里首先先创建UICollectionView的IBOutlet对象,然后在viewDidLoad()方法里面设置数据源、代理源为self即可。

import UIKit

class ViewController: UIViewController, UICollectionViewDataSource, UICollectionViewDelegate{
        @IBOutlet weak var collection: UICollectionView!
        var images: Array = ["P11","P12","P13","P14","P15","P16","P17","P18","P19"];
    
    func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
        return images.count;
    }
    
    func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
        let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "myCell", for: indexPath);
        
        let label = cell.viewWithTag(1002) as! UILabel;
        label.text = "No.\(indexPath.item)";
        
        let imageView = cell.viewWithTag(1001) as! UIImageView;
        let imageName = images[(indexPath as NSIndexPath).row];
        imageView.image = UIImage(named: imageName);
        
        return cell;
    }
    
    func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
        let cell = collectionView.cellForItem(at: indexPath);
        
        print("You clicked \(indexPath.item) item.");
        
        let view = cell?.viewWithTag(1001);
        view?.layer.opacity = 0.5;
        
        let label = cell?.viewWithTag(1002) as! UILabel;
        label.text = "OK.";
    }
    

    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view.
        
        self.collection.delegate = self
        self.collection.dataSource = self
    }


}


六:效果图(横向滑动、竖直滑动设置)

在这里插入图片描述
如何设置滑动方向?
在这里插入图片描述
如图所示,先单击左侧UICollectionView部分,然后选择右侧“Scroll Direction”即可。如果要展示的效果像RecyclerView那样不带九宫格(即默认全部水平滚动或上下滚动),注意设置cell的高度与UICollectionView的高度一致即可(实际上只要UICollectionView的高度不超过cell高度两倍,那么最终将不会显示九宫格形式)。

七:cell子项与UICollectionView的布局关系

参考这篇文章:UICollectionView cell子项布局的分析

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值