Swift 使用CollectionView 实现图片轮播封装

前言: 这篇你可以学会自定义视图,创建collectionView,协议的使用,定时器;

首先新建一个继承于UIView的视图,且用collectionView实现所以需要签订两个协议代码如下:

let sectionNum: Int = 100 // 区的数量
let width = UIScreen.mainScreen().bounds.size.width  // 屏幕宽度
let height = UIScreen.mainScreen().bounds.size.width // 屏幕高度 
// 因为要实现轮播图片可以点击定义一个协议
// 协议
protocol XTCycleViewDelegate {
    func didSelectIndexCollectionViewCell(index: Int)->Void
}
class XTCycleScrollView: UIView,UICollectionViewDelegate,UICollectionViewDataSource{

使用到的变量以及创建视图

var delegate: XTCycleViewDelegate?
    var cycleCollectionView: UICollectionView?
    var images = NSMutableArray()
    var pageControl = UIPageControl()
    var flowlayout = UICollectionViewFlowLayout()
    var timer = NSTimer()
    override init(frame: CGRect) {
        super.init(frame: frame)
        self.createSubviews(frame)
    }

    required init?(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }

布局必要的UI以及创建定时器

func createSubviews(frame: CGRect){
        cycleCollectionView = UICollectionView.init(frame: CGRectMake(0,0,frame.size.width,frame.size.height),collectionViewLayout: flowlayout)
        flowlayout.itemSize = CGSizeMake(frame.size.width,frame.size.height);
        flowlayout.minimumInteritemSpacing = 0;
        flowlayout.minimumLineSpacing = 0;
        flowlayout.scrollDirection = UICollectionViewScrollDirection.Horizontal;
        cycleCollectionView!.backgroundColor = UIColor.lightGrayColor()
        cycleCollectionView!.pagingEnabled = true
        cycleCollectionView!.dataSource  = self
        cycleCollectionView!.delegate = self
        cycleCollectionView!.showsHorizontalScrollIndicator = false
        cycleCollectionView!.showsVerticalScrollIndicator = false
        cycleCollectionView!.registerClass(ZJCustomCycleCell.self,forCellWithReuseIdentifier: "cellId")
        self.addSubview(cycleCollectionView!)
        pageControl = UIPageControl.init(frame: CGRectMake(0,frame.size.width / 2,30))
        pageControl.center = CGPointMake(frame.size.width / 2,frame.size.height - 20);
        self.addSubview(pageControl);
        self.addTimer()
    }

定时器初始化

func addTimer(){
        let timer1 = NSTimer.init(timeInterval: 2,target: self,selector: "nextPageView",userInfo: nil,repeats: true)
        NSRunLoop.currentRunLoop().addTimer(timer1,forMode: NSRunLoopCommonModes)
        timer = timer1
    }

销毁定时器

func removeTimer(){
        self.timer.invalidate()
    }

实现循环滚动

func returnIndexPath()->NSIndexPath{
        var currentIndexPath = cycleCollectionView!.indexPathsForVisibleItems().last
        currentIndexPath = NSIndexPath.init(forRow: (currentIndexPath?.row)!,inSection: sectionNum / 2)
        cycleCollectionView!.scrollToItemAtIndexPath(currentIndexPath!,atScrollPosition: UICollectionViewScrollPosition.Left,animated: false)
        return currentIndexPath!;
    }
 func nextPageView(){

        let indexPath = self.returnIndexPath()
        var item = indexPath.row + 1;
        var section = indexPath.section;
        if item == images.count {
            item = 0
            section++
        }
        self.pageControl.currentPage = item;
        let nextIndexPath = NSIndexPath.init(forRow: item,inSection: section)
        cycleCollectionView!.scrollToItemAtIndexPath(nextIndexPath,animated: true)
    }

collectionView Delegate

// 重用池
     func collectionView(collectionView: UICollectionView,cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell {
        // 这里使用的自定义cell,下面会贴出自定义cell代码
        let cell = collectionView.dequeueReusableCellWithReuseIdentifier("cellId",forIndexPath: indexPath) as! ZJCustomCycleCell
        // 这个Label实现显示数字,表示是第几张图片
        cell.labelTitle.text = NSString(format: "%d",indexPath.row) as String
        // 这里是图片赋值
        let url:String = self.images[indexPath.row] as! String
        // 这里我使用的是一个赋值图片的三方库,看自己喜好,为方便我没有自己写
        cell.imageView.hnk_setImageFromURL(NSURL.init(string: url)!)
        return cell
    }
    func numberOfSectionsInCollectionView(collectionView: UICollectionView) -> Int {
        return sectionNum
    }
    func collectionView(collectionView: UICollectionView,numberOfItemsInSection section: Int) -> Int {
        // 在这里给出了pageControl的数量
        pageControl.numberOfPages = images.count
        return images.count
    }
// 重新添加定时器
    func scrollViewDidEndDragging(scrollView: UIScrollView,willDecelerate decelerate: Bool) {
        self.addTimer()
    }
    // 手动滑动的时候销毁定时器
    func scrollViewWillBeginDragging(scrollView: UIScrollView) {
        self.removeTimer()
    }

设置当前的pagecontrol

func scrollViewDidEndDecelerating(scrollView: UIScrollView) {
        let page = (Int(scrollView.contentOffset.x) / Int(width)) % images.count
        pageControl.currentPage = page
    }

点击方法

func collectionView(collectionView: UICollectionView,didSelectItemAtIndexPath indexPath: NSIndexPath) {
        self.delegate?.didSelectIndexCollectionViewCell(indexPath.row)
    }

下面是我在自定义cell中的代码

var urlImage: String = ""
    var imageView = UIImageView()
    var labelTitle = UILabel()
    override init(frame: CGRect) {
        super.init(frame: frame)
        self.createSubviews(frame)
    }

    required init?(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }
    func createSubviews(frame: CGRect){
        imageView = UIImageView.init(frame: CGRectMake(0,frame.size.height))
        self.contentView.addSubview(imageView)
        labelTitle = UILabel.init(frame: CGRectMake(10,10,30,30))
        imageView.addSubview(labelTitle)
    }

封装基本完成了,下面看看如何使用

// 创建
        let cycle = XTCycleScrollView.init(frame: CGRectMake(0,70,width,175))
        // 要实现点击需要制定代理人
        cycle.delegate = self;
        // 图片链接数组
        let images: NSMutableArray = ["","",""]
        // 数组赋值
        cycle.images = images
        self.view.addSubview(cycle)

实现代理方法

func didSelectIndexCollectionViewCell(index: Int) {
        print("\(index)")
    }

总结: 这样就实现了简单的图片轮播效果,并且带有点击方法,都看到这里就点个赞吧. 哈哈

相关文章

软件简介:蓝湖辅助工具,减少移动端开发中控件属性的复制和粘...
现实生活中,我们听到的声音都是时间连续的,我们称为这种信...
前言最近在B站上看到一个漂亮的仙女姐姐跳舞视频,循环看了亿...
【Android App】实战项目之仿抖音的短视频分享App(附源码和...
前言这一篇博客应该是我花时间最多的一次了,从2022年1月底至...
因为我既对接过session、cookie,也对接过JWT,今年因为工作...