欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

iOS Swift版 UICollectionView的使用

程序员文章站 2022-04-13 12:06:12
...

前言:

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

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

这里为了方便演示用到了9张相同的图片,文件名称随意,但不要都相同
iOS Swift版 UICollectionView的使用

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

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

iOS Swift版 UICollectionView的使用
3:设置cell的Identifier。如图所示,先点击左侧区域,再点击右侧区域设置。这里的值为String类型且唯一
iOS Swift版 UICollectionView的使用

4:设置cell子项控件的Tag。这里为方便演示仅设置了UIImageView的tag。如图所示,先单击要设定tag值的控件,再单击右侧"Tag"栏以设定Tag。这里的值为Int且唯一。
iOS Swift版 UICollectionView的使用

三:实现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
    }


}


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

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