swift中使用UIColllectionView实现横向轮播的一般方法

//

//  HomeLiveRankCell.swift

//  YYSwiftProject

//

//  Created by Domo on 2018/7/28.

//  Copyright © 2018年 知言网络. All rights reserved.

//

 

import UIKit

class HomeLiveRankCell: UICollectionViewCell {

    

    private var multidimensionalRankVosList: [MultidimensionalRankVosModel]?

    

    private let LiveRankCellID = "LiveRankCell"

    // MARK: - 滚动排行榜

    private lazy var collectionView: UICollectionView = {

        let layout = UICollectionViewFlowLayout.init()

        layout.sectionInset = UIEdgeInsetsMake(0, 0, 0, 0)

        layout.minimumInteritemSpacing = 0

        layout.minimumLineSpacing = 0

        layout.itemSize = CGSize( (YYScreenWidth-30), height:self.frame.size.height)

//        layout.sectionInset = UIEdgeInsetsMake(0, 0, 0, 0)

        layout.scrollDirection = UICollectionViewScrollDirection.horizontal

        let collectionView = UICollectionView.init(frame:.zero, collectionViewLayout: layout)

        collectionView.contentSize = CGSize( (YYScreenWidth-30), height: self.frame.size.height)

        collectionView.delegate = self

        collectionView.dataSource = self

        collectionView.backgroundColor = UIColor.white

        collectionView.showsVerticalScrollIndicator = false

        collectionView.showsHorizontalScrollIndicator = false

        collectionView.isPagingEnabled = true

        collectionView.register(LiveRankCell.self, forCellWithReuseIdentifier:LiveRankCellID)

        

        return collectionView

    }()

    

    var timer: Timer?

    override init(frame: CGRect) {

        super.init(frame: frame)

        self.backgroundColor = UIColor.white

        self.addSubview(self.collectionView)

        self.collectionView.snp.makeConstraints { (make) in

            make.width.height.equalToSuperview()

            make.center.equalToSuperview()

        }

        

        // 开启定时器

        starTimer()

    }

    

    required init?(coder aDecoder: NSCoder) {

        super.init(coder: aDecoder)

    }

    

    // 界面赋值并刷新

    var multidimensionalRankVos:[MultidimensionalRankVosModel]? {

        didSet {

            guard let model = multidimensionalRankVos else { return }

            self.multidimensionalRankVosList = model

            self.collectionView.reloadData()

        }

    }

}

extension HomeLiveRankCell: UICollectionViewDataSource, UICollectionViewDelegate {

    func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {

        return (self.multidimensionalRankVosList?.count ?? 0)*100

    }

    

    func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {

        let cell:LiveRankCell = collectionView.dequeueReusableCell(withReuseIdentifier: LiveRankCellID, for: indexPath) as! LiveRankCell

        cell.backgroundColor = UIColor.init(red: 248/255.0, green: 245/255.0, blue: 246/255.0, alpha: 1)

        cell.multidimensionalRankVos = self.multidimensionalRankVosList?[indexPath.row%(self.multidimensionalRankVosList?.count)!]

        return cell

    }

    

    func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {

        print(indexPath.row%(self.multidimensionalRankVosList?.count)!)

    }

    

    /// 开启定时器

    func starTimer () {

        let timer = Timer.init(timeInterval: 3, target: self, selector: #selector(nextPage), userInfo: nil, repeats: true)

        // 这一句代码涉及到runloop 和 主线程的知识,则在界面上不能执行其他的UI操作

        RunLoop.main.add(timer, forMode: RunLoopMode.commonModes)

        self.timer = timer

    }

    

    /// 在1秒后,自动跳转到下一页

    @objc func nextPage() {

        // 1.获取collectionView的X轴滚动的偏移量

        let currentOffsetX = collectionView.contentOffset.x

        let offsetX = currentOffsetX + collectionView.bounds.width

        // 2.滚动该位置

        collectionView.setContentOffset(CGPoint(x: offsetX, y: 0), animated: true)

    }

    

//    // 监听collectionView的滚到

//    func scrollViewDidScroll(_ scrollView: UIScrollView) {

//        // 1、获取滚动的偏移量 + scrollView.bounds.width * 0.5给偏移量加一半,当滑动一般就滚动pageControl的当前选中

//        let offsetX = scrollView.contentOffset.x + scrollView.bounds.width * 0.5

//        // 2、计算pageContra的currentIndex。这 % (cycleModelArr?.count ?? 1)也是跟上同样道理

//        pageControl.currentPage = Int(offsetX / scrollView.bounds.width) % (imageArray?.count ?? 1)

//    }

//

    /// 当collectionView开始拖动的时候,取消定时器

    func scrollViewWillBeginDragging(_ scrollView: UIScrollView) {

        self.timer?.invalidate()

        self.timer = nil

    }

    

    /// 当用户停止拖动的时候,开启定时器

    func scrollViewWillEndDragging(_ scrollView: UIScrollView, withVelocity velocity: CGPoint, targetContentOffset: UnsafeMutablePointer<CGPoint>) {

        starTimer()

    }

}

//

//  LiveRankCell.swift

//  YYSwiftProject

//

//  Created by Domo on 2018/7/28.

//  Copyright © 2018年 知言网络. All rights reserved.

//

import UIKit

class LiveRankCell: UICollectionViewCell {

    private lazy var imageView : UIView = {

        let imageView = UIView()

        return imageView

    }()

    

    private lazy var titleLabel : UILabel = {

       let label = UILabel()

        label.font = UIFont.systemFont(ofSize: 18)

        return label

    }()

    

    private lazy var label : UILabel = {

        let label = UILabel()

        label.text = ">"

        label.textColor = UIColor.lightGray

        return label

    }()

    

    override init(frame: CGRect) {

        super.init(frame: frame)

        

        self.addSubview(self.titleLabel)

        self.titleLabel.snp.makeConstraints { (make) in

            make.left.equalToSuperview().offset(10)

            make.height.equalTo(40)

            make.width.equalTo(100)

            make.centerY.equalToSuperview()

        }

        

        self.addSubview(self.imageView)

        self.imageView.snp.makeConstraints { (make) in

            make.right.equalToSuperview().offset(-5)

            make.top.equalToSuperview().offset(5)

            make.bottom.equalToSuperview().offset(-5)

            make.width.equalTo(180)

        }

        

        self.imageView.addSubview(self.label)

        self.label.snp.makeConstraints { (make) in

            make.right.equalToSuperview().offset(-5)

            make.height.width.equalTo(10)

            make.centerY.equalToSuperview()

        }

    }

    

    required init?(coder aDecoder: NSCoder) {

        super.init(coder: aDecoder)

    }

    

    var multidimensionalRankVos:MultidimensionalRankVosModel? {

    didSet {

        guard let model = multidimensionalRankVos else { return }

            self.titleLabel.text = model.dimensionName

        let num:Int = (model.ranks?.count)!

        let margin:CGFloat = 50

        for index in 0..<num {

                let picView = UIImageView.init(frame: CGRect(x:margin*CGFloat(index)+5*CGFloat(index),y:5,margin,height:margin))

                picView.layer.masksToBounds = true

                picView.layer.cornerRadius = picView.frame.size.width/2

                picView.kf.setImage(with: URL(string: (model.ranks?[index].coverSmall!)!))

                self.imageView.addSubview(picView)

                }

            }

        }

}

原文地址:https://www.cnblogs.com/sundaysme/p/10613047.html