全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

Swift实现无限轮播效果

从今天开始,我学习的重点开始转向Swift,并且会分享一些自己学习的心得体会,今天给大家带来的的是无限轮播。广告页的无限轮播是非常常见的一个功能,大多数APP都有,大多数程序员也都实现过,今天我们用Swift实现一下。项目地址

图片切换我们可以选择的基本控件有两个UIScrollView 和 UICollectionView,这次我们选择UICollectionView;既然是轮播,就会用到Timer。所以,我们这次主要应用的知识点为UICollectionView 和 Timer;

import UIKit

class CycleScrollView: UIView, UICollectionViewDelegate,UICollectionViewDataSource {

  var bottomView : UICollectionView?
  var width : CGFloat?
  var height : CGFloat?
  var timer : Timer?
  
  override init(frame: CGRect){
    
    super.init(frame: frame)
    // 1.设置背景色
    self.backgroundColor = UIColor.clear
    // 2.设置宽高
    width = self.frame.size.width
    height = self.frame.size.height
    // 3.添加bottomView
    setupBottomView()
    // 4.添加定时器
    setupTimer()
  }
  required init?(coder aDecoder: NSCoder) {
    fatalError("init(coder:) has not been implemented")
  }
  
  
  func setupBottomView() {
    
    // 5.设置collectionView的布局
    let flowLayout = UICollectionViewFlowLayout();
    flowLayout.itemSize = self.bounds.size
    flowLayout.minimumLineSpacing = 0;
    flowLayout.minimumInteritemSpacing = 0;
    flowLayout.scrollDirection = UICollectionViewScrollDirection.horizontal;
    bottomView = UICollectionView.init(frame: self.bounds, collectionViewLayout: flowLayout)
    self.addSubview(bottomView!);
    // 6.设置collectionView的尺寸
    bottomView?.contentSize = CGSize(width:width! * CGFloat(4),height:height!)
    // 7.分页
    bottomView?.isPagingEnabled = true
    // 8.去掉滚动条
    bottomView?.showsVerticalScrollIndicator = false
    bottomView?.showsHorizontalScrollIndicator = false
    // 9.设置代理
    bottomView?.delegate = self
    bottomView?.dataSource = self
    // 10.注册cell
    bottomView?.register(UICollectionViewCell().classForCoder, forCellWithReuseIdentifier: "ID");
    if #available(iOS 10.0, *) {
      // 11.预加载
      bottomView?.isPrefetchingEnabled = true
    } else {
      // Fallback on earlier versions
    }
  }
  func setupTimer() {
    // 12.实例化定时器
    timer = Timer.init(timeInterval: 2, target: self, selector: #selector(timerAction), userInfo: nil, repeats: true);
    RunLoop.main.add(timer!, forMode: RunLoopMode.defaultRunLoopMode);

    DispatchQueue.main.asyncAfter(deadline: DispatchTime.now() + 2) {
    
      self.timer?.fire();
    }
  }
  func timerAction() {
    
    var contentOffsetX = (self.bottomView?.contentOffset.x)! + self.frame.size.width
    
    if contentOffsetX > self.frame.size.width * 3 {
      // 当前视图显示的是第三个的时候,设置bottomView的偏移量为0
      self.bottomView?.contentOffset = CGPoint(x:0,y:0)
      contentOffsetX = self.frame.size.width
    }
     self.bottomView?.setContentOffset(CGPoint(x:contentOffsetX,y:0), animated: true)
  }
  // 重写removeFromSuperview方法,用于删除定时器,否则定时器一直存在,浪费内存
  override func removeFromSuperview() {
    
    timer?.invalidate()
    timer = nil
    super.removeFromSuperview()
  }
  // Mark:UICollectionViewDataSource
  // 设置Itmes
  func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
    
    return 4;
  }
  // 设置cell
  func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
    
    let cell : UICollectionViewCell = collectionView.dequeueReusableCell(withReuseIdentifier: "ID", for: indexPath)
    for view : UIView in cell.contentView.subviews {
      
      view.removeFromSuperview()
    }
    let imageView = UIImageView.init(frame: cell.contentView.bounds)
    if indexPath.row < 3 {
      
      imageView.image = UIImage.init(named: String(indexPath.row))

    } else {
      imageView.image = UIImage.init(named: String(0))
    }
    cell.contentView.addSubview(imageView)
    
    return cell;
  }
  // Mark:UICollectionViewDelegate
  // 点击方法
  func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
    
    print("您点击了第 \(indexPath.row == 3 ? 0 : indexPath.row) 个");
  }
  
}

UICollectionView 和 Timer的用法和OC基本相同。Swift和OC的UI部分应该是一致的,因为底层都是OpenGL。我直接说一下区别:

1.Timer:如果重复,OC是等一个间隔再执行的,Swift是立即执行的,所以我用了GCD延时开启定时器。

2.Swift 没有 CGPointZero。

无限轮播的原理就是在最后面多添加一个和第一个相同的itme。当你滑动到最后一个itme时,把UICollectionView的contentOffset置零,继续向右活动。如果不添加,会给用户一种卡顿的感觉。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。


# Swift  # 轮播  # swift实现自动轮播图效果(UIScrollView+UIPageControl+Timer)  # Swift仿选择电影票的效果并实现无限/自动轮播的方法  # 的是  # 都是  # 就会  # 都有  # 第一个  # 当你  # 用了  # 给大家  # 也都  # 分页  # 重写  # 会给  # 可以选择  # 第三个  # 大家多多  # 量为  # 背景色  # 滚动条  # 应该是  # 点为 


相关文章: 如何选择长沙网站建站模板?H5响应式与品牌定制哪个更优?  高性能网站服务器配置指南:安全稳定与高效建站核心方案  c++怎么使用类型萃取type_traits_c++ 模板元编程类型判断【方法】  网站企业制作流程,用什么语言做企业网站比较好?  ,石家庄四十八中学官网?  安徽网站建设与外贸建站服务专业定制方案  如何配置IIS站点权限与局域网访问?  广州网站制作公司哪家好一点,广州欧莱雅百库网络科技有限公司官网?  建站之星导航菜单设置与功能模块配置全攻略  如何在阿里云通过域名搭建网站?  南阳网站制作公司推荐,小学电子版试卷去哪里找资源好?  网站制作需要会哪些技术,建立一个网站要花费多少?  建站之星后台管理:高效配置与模板优化提升用户体验  建站之星微信建站一键生成小程序+多端营销系统  企业网站制作公司网页,推荐几家专业的天津网站制作公司?  制作证书网站有哪些,全国城建培训中心证书查询官网?  如何在Golang中使用encoding/gob序列化对象_存储和传输数据  公司网站制作需要多少钱,找人做公司网站需要多少钱?  在线ppt制作网站有哪些,请推荐几个好的课件下载的网站?  建站之星代理费用多少?最新价格详情介绍  如何快速启动建站代理加盟业务?  如何将凡科建站内容保存为本地文件?  建站之星安装后界面空白如何解决?  网站图片在线制作软件,怎么在图片上做链接?  广州网站设计制作一条龙,广州巨网网络科技有限公司是干什么的?  已有域名和空间如何搭建网站?  如何快速选择适合个人网站的云服务器配置?  如何在Ubuntu系统下快速搭建WordPress个人网站?  高端企业智能建站程序:SEO优化与响应式模板定制开发  如何高效搭建专业期货交易平台网站?  攀枝花网站建设,攀枝花营业执照网上怎么年审?    制作网站哪家好,cc、.co、.cm哪个域名更适合做网站?  如何获取开源自助建站系统免费下载链接?  哪家制作企业网站好,开办像阿里巴巴那样的网络公司和网站要怎么做?  中山网站推广排名,中山信息港登录入口?  如何在服务器上三步完成建站并提升流量?  合肥做个网站多少钱,合肥本地有没有比较靠谱的交友平台?  制作网站软件推荐手机版,如何制作属于自己的手机网站app应用?  如何快速搭建高效香港服务器网站?  黑客如何通过漏洞一步步攻陷网站服务器?  巅云智能建站系统:可视化拖拽+多端适配+免费模板一键生成  制作营销网站公司,淘特是干什么用的?  高端智能建站公司优选:品牌定制与SEO优化一站式服务  网站按钮制作软件,如何实现网页中按钮的自动点击?  高性价比服务器租赁——企业级配置与24小时运维服务  如何配置支付宝与微信支付功能?  建站之星手机一键生成:多端自适应+小程序开发快速建站指南  活动邀请函制作网站有哪些,活动邀请函文案?  c# Task.Yield 的作用是什么 它和Task.Delay(1)有区别吗 

您的项目需求

*请认真填写需求信息,我们会在24小时内与您取得联系。