• 经营者要想“我心换你心”,就要未雨绸缪,让不诚信的诱惑少一点,如此才能在市场中生存下来。反过来说,承担不起亏损就关门歇业,是否也是一种不诚信呢? 2019-09-14
  • 上海市陆家嘴:打造社区多元治理“共同体” 2019-09-14
  • 2017最具体育活力城市排行榜 2019-09-14
  • 李克勤献唱央视“世界杯主题歌” 2018国语专辑筹备中李克勤 世界杯 2019-09-08
  • 回复@看着就想笑:难道公有制社会主义就不能生存发展吗?事实上公有制会生存发展的更好! 2019-09-03
  • 陵川县全力推进乡村振兴战略 2019-09-01
  • 周国平:男女之爱已经很强烈了,但亲子之爱更强烈 2019-09-01
  • 出租广州市荔湾区芳村大道东169号 2019-08-29
  • (原创)取消“份子钱”是出租车改革必须迈出的一步 2019-08-21
  • Facebook公关掌门离职 是应对隐私丑闻干将 2019-08-20
  • 你这纯粹是胡说八道!农民的宅基地,需要交钱才能使用吗?你敢推行这样的政策吗?你也只敢推行对工人的住宅地,要交钱才能使用!这样合理吗?那些交不起房钱的人,难道应该 2019-08-13
  • 西部网(陕西新闻网)硬科技频道 2019-08-13
  • 新华时评:成果不易,更需诚意与信任呵护 2019-08-09
  • 好好的书报亭放没放样,周围堆得一塌糊涂乱七八糟,真正的主人都搓麻将去了。再现代化造型在金钱至上的社会不可能再有相应的雅知气了。 2019-08-09
  • 2018海创会带你领略黑科技产品 2019-08-05
  • 平码开码结果:iOS Swift利用UICollectionView实现无限轮播功能(原理)详解

    平码三中山论坛 www.mslzq.tw 前言

    作为一个资深(自认为)iOS程序猿,会经常用到轮播图,上一次使用UIScrollView实现无限轮播的效果,这一次在Swift语言中,我使用UICollectionView再为大家讲解一次无限轮播的实现原理。

    先上图:


    UICollectionView-无限轮播.gif

    首先需要实现了就是UICollectionView的分页,这个很简单:

    collectionView.isPagingEnabled = true

    接下来就是原理,在UICollectionView的两端需要先添加两张图片,首段需要添加最后一张图片,而尾端需要添加第一张图片,然后在中间的位置上一次添加各个图片。这个其实是很容易实现的:

     func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
     let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "ImageCollectionViewCell", for: indexPath) as! ImageCollectionViewCell
     
     /// 给图片赋值(在首尾分别添加两张图片)
     if (indexPath.row == 0) {
      cell.imageName = imageNameList.last
     } else if (indexPath.row == self.imageNameList.count + 1) {
      cell.imageName = imageNameList.first
     } else {
      cell.imageName = imageNameList[indexPath.row - 1]
     }
     
     return cell
     }

    这样在滑动的时候,通过偏移量就可以实现无限轮播的效果了。当滑动停止时判断偏移量,当偏移量为0时(视图上显示的是最后一张图片),这时候就直接调动调整偏移量的方法,把UICollectionView偏移到最后一张图片的位置。滑动到尾端时是同理。

     func scrollViewDidEndDecelerating(_ scrollView: UIScrollView) {
     /// 当UIScrollView滑动到第一位停止时,将UIScrollView的偏移位置改变
     if (scrollView.contentOffset.x == 0) {
      scrollView.contentOffset = CGPoint(x: CGFloat(self.imageNameList.count) * kScreenWidth,y: 0)
      self.pageControl.currentPage = self.imageNameList.count
      /// 当UIScrollView滑动到最后一位停止时,将UIScrollView的偏移位置改变
     } else if (scrollView.contentOffset.x == CGFloat(self.imageNameList.count + 1) * kScreenWidth) {
      scrollView.contentOffset = CGPoint(x: kScreenWidth,y: 0)
      self.pageControl.currentPage = 0
     } else {
      self.pageControl.currentPage = Int(scrollView.contentOffset.x / kScreenWidth) - 1
     }
     }

    其实原理很简单,个人认为使用UICollectionView实现无限轮播比起UIScrollView更加实用并且便于维护,接下来我将代码全部列一下:

    import UIKit
    
    let kScreenWidth = UIScreen.main.bounds.width
    
    class ViewController: UIViewController {
     
     lazy var collectionView: UICollectionView = {
     let flowLayout = UICollectionViewFlowLayout()
     flowLayout.minimumLineSpacing = 0
     flowLayout.minimumInteritemSpacing = 0
     flowLayout.scrollDirection = .horizontal
     flowLayout.itemSize = CGSize(width: kScreenWidth, height: 200)
     
     let collectionView = UICollectionView(frame: CGRect(x: 0, y: 0, width: UIScreen.main.bounds.width, height: 200), collectionViewLayout: flowLayout)
     
     collectionView.isPagingEnabled = true
     collectionView.showsHorizontalScrollIndicator = false
     collectionView.backgroundColor = UIColor.white
     collectionView.delegate = self
     collectionView.dataSource = self
     self.view.addSubview(collectionView)
     
     return collectionView
     }()
     
     lazy var pageControl: UIPageControl = {
     let pageControl = UIPageControl(frame: CGRect(x: 0, y: 150, width: kScreenWidth, height: 50))
     
     pageControl.numberOfPages = self.imageNameList.count
     pageControl.currentPage = 0
     
     pageControl.tintColor = UIColor.black
     pageControl.pageIndicatorTintColor = UIColor.gray;
     
     return pageControl;
     }()
     
     lazy var imageNameList: [String] = {
     let imageList = ["image0", "image1", "image2", "image3"]
     
     return imageList
     }()
    
     override func viewDidLoad() {
     super.viewDidLoad()
     
     setupController()
     }
     
     func setupController() {
     /// 设置数据
     collectionView.register(ImageCollectionViewCell.self, forCellWithReuseIdentifier: "ImageCollectionViewCell")
     
     collectionView.reloadData()
     collectionView.scrollToItem(at: IndexPath(row: 1, section: 0), at: .left, animated: false)
     
     self.view.addSubview(pageControl)
     }
    
    }
    
    extension ViewController: UICollectionViewDataSource {
     
     func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
     /// 这步只是防止崩溃
     if (imageNameList.count == 0) {
      return 0
     }
     return imageNameList.count + 2
     }
     
     func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
     let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "ImageCollectionViewCell", for: indexPath) as! ImageCollectionViewCell
     
     /// 给图片赋值(在首尾分别添加两张图片)
     if (indexPath.row == 0) {
      cell.imageName = imageNameList.last
     } else if (indexPath.row == self.imageNameList.count + 1) {
      cell.imageName = imageNameList.first
     } else {
      cell.imageName = imageNameList[indexPath.row - 1]
     }
     
     return cell
     }
     
    }
    
    extension ViewController: UICollectionViewDelegate {
     
     func scrollViewDidEndDecelerating(_ scrollView: UIScrollView) {
     /// 当UIScrollView滑动到第一位停止时,将UIScrollView的偏移位置改变
     if (scrollView.contentOffset.x == 0) {
      scrollView.contentOffset = CGPoint(x: CGFloat(self.imageNameList.count) * kScreenWidth,y: 0)
      self.pageControl.currentPage = self.imageNameList.count
      /// 当UIScrollView滑动到最后一位停止时,将UIScrollView的偏移位置改变
     } else if (scrollView.contentOffset.x == CGFloat(self.imageNameList.count + 1) * kScreenWidth) {
      scrollView.contentOffset = CGPoint(x: kScreenWidth,y: 0)
      self.pageControl.currentPage = 0
     } else {
      self.pageControl.currentPage = Int(scrollView.contentOffset.x / kScreenWidth) - 1
     }
     }
     
    }
    
    /// collectionView图片的cell
    class ImageCollectionViewCell: UICollectionViewCell {
     
     /// 显示的图片
     let imageView = UIImageView()
     var imageName: String? = "" {
     didSet {
      if let name = imageName {
      imageView.image = UIImage(named: name)
      }
     }
     }
     
     override init(frame: CGRect) {
     super.init(frame: frame)
     
     setupCell();
     }
     
     /// 初始化视图
     func setupCell() {
     imageView.frame = self.bounds
     contentView.addSubview(imageView)
     }
     
     required init?(coder aDecoder: NSCoder) {
     fatalError("init(coder:) has not been implemented")
     } 
    }

    ok,喜欢的话可以点一下收藏哈,用UIScrollView实现轮播的原理

    总结

    以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对CAD之家的支持。

    为您推荐

    发表评论

    联系我们

    联系我们

    在线咨询: QQ交谈

    地址:中国·贵州·贵阳 友情链接QQ:1034559333 本站QQ群:123733639
    关注微信
    微信扫一扫关注我们

    微信扫一扫关注我们

    关注微博
    返回顶部

    关于本站 || 版权声明 || 免责条款 || 隐私条款 || 平码三中山论坛 || ||

    Copyright??2018 平码三中山论坛 All Rights Reserved·黔ICP备15000265号-2

  • 经营者要想“我心换你心”,就要未雨绸缪,让不诚信的诱惑少一点,如此才能在市场中生存下来。反过来说,承担不起亏损就关门歇业,是否也是一种不诚信呢? 2019-09-14
  • 上海市陆家嘴:打造社区多元治理“共同体” 2019-09-14
  • 2017最具体育活力城市排行榜 2019-09-14
  • 李克勤献唱央视“世界杯主题歌” 2018国语专辑筹备中李克勤 世界杯 2019-09-08
  • 回复@看着就想笑:难道公有制社会主义就不能生存发展吗?事实上公有制会生存发展的更好! 2019-09-03
  • 陵川县全力推进乡村振兴战略 2019-09-01
  • 周国平:男女之爱已经很强烈了,但亲子之爱更强烈 2019-09-01
  • 出租广州市荔湾区芳村大道东169号 2019-08-29
  • (原创)取消“份子钱”是出租车改革必须迈出的一步 2019-08-21
  • Facebook公关掌门离职 是应对隐私丑闻干将 2019-08-20
  • 你这纯粹是胡说八道!农民的宅基地,需要交钱才能使用吗?你敢推行这样的政策吗?你也只敢推行对工人的住宅地,要交钱才能使用!这样合理吗?那些交不起房钱的人,难道应该 2019-08-13
  • 西部网(陕西新闻网)硬科技频道 2019-08-13
  • 新华时评:成果不易,更需诚意与信任呵护 2019-08-09
  • 好好的书报亭放没放样,周围堆得一塌糊涂乱七八糟,真正的主人都搓麻将去了。再现代化造型在金钱至上的社会不可能再有相应的雅知气了。 2019-08-09
  • 2018海创会带你领略黑科技产品 2019-08-05
  • 河南麻将玩法视频 大乐透走势图带连线图表新浪 江西新时时中奖秘籍 韩国快三预测 mg花花公子免费选哪个 辽宁十一选五走势图一定牛 四川时时号码查询 山东群英会任二遗漏 重庆时时历史查询 黑龙江ll选五开奖结果