一:简介

图片轮播功能在App中是一个非常常见的功能,即允许定时滚动,也允许拖拽滚动,也可以点击每张图片触发事件。


二:实现方式

图片轮播功能的实现方式有很多中,

  • UIScrollView + N个UIImageView
  • UIScrollView + 3个UIImageView
  • UICollectionView
  • 其它方式

1. UIScrollView + N个UIImageView

一般初学者都会采用这种方式:UIView作为父视图,将UIScrollView和UIPageControl添加到父视图UIView上,然后再将所有UIImageView从头到尾依次添加到UIScrollView上,滚动视图的偏移量 offset.x 默认为0。

这种方式最简单易懂,一般图片轮播功能的图片张数在10张以内,因为UIScrollView没有循环利用的功能,假如图片超过10张有很多张(比如100个)那么就要创建100个UIImageView,这是比较浪费内存的,显然这种方式只能玩玩不能用于实际开发当中。


2. UIScrollView + 3个UIImageView

方式一当图片个数过多的情况下会创建很多个UIImageView,为了解决这个问题,方式二将采用始终创建3个UIImageView的方式来处理。

该方式采用以UIView作为父视图,UIScrollView和UIPageControl 作为子视图,创建3个UIImageView依次添加到UIScrollView中, 第一张图片显示数组中的最后一张图片,第二张图片显示数组中的第一张图片,第三张图片显示数组中的第二张图片,然后再让UIScrollView的偏移量为一个滚动视图的宽度offset.x = ScreenWidth, 这样用户看到的就是从图片的第一张开始看的,向左滑动看到第二张图片,向右滑动看到最后一张图片,这样的逻辑没毛病,这种逻辑和方式一的逻辑最大的不同是初始化时偏移了一个宽度(假如有7张图片)

当用户向左前进时此时,此时没有什么特殊之处,此时滚动视图会再偏移一个宽度,达到下面的状态

这种状态滚动结束之后如果不进行处理的话,用户就没法继续向左滚动了,因为已经滚动到头了,所以接下来要做特殊逻辑处理:

  • 偷偷替换3张图片:

    • 将中间的UIImageView0对应的图片换成当前屏幕上UIImageView1的图片images[1];
    • 将最后一个UIImageView1对应的图片换成UIImageView0对应的图片的下一张图片,即images[1];
    • 将第一个UIImageView2对应的图片换成当前屏幕显示的图片的上一张图片即images[0];
  • 重置UIScrollView的偏移量为一个屏幕宽度offset.x = ScreenWidth;

经过上述2个过程,用户又可以进行滚动了,向左向右滚动都没有问题

注意:这种逻辑有一个需要注意的地方就是当用户滚动临界点,比如滚动到最后一张用户还要往后滚动不能出现数组越界错误,下一张应该为第一张图片images[0],不能出现images[7],当用户滚动第一张时还要继续往前滚动也不能出现数组越界错误, 前面的图片应该为images[6],不能出现images[-1], 数组越界问题需要特殊的控制

该示例只分析了一直向左活动的操作,像右滑动的操作逻辑是和向左的完全一样的

github封装的图片无限轮播的自定义控件 https://github.com/mengday/XXImageLoopView


UICollectionView实现方式

方式二解决了UIScrollView没有重用机制的问题,而有重用机制的控件有UITableView和UICollectionView,而UITableView的滚动方向是垂直方向,可以通过对UITableView进行旋转90°,这样就可以水平方向了,但是UITableViewCell中的内容是反的,还要对内容再旋转90°更正方向,这样处理比较麻烦;而UICollectionView是支持水平方向的滚动的,所以UICollectionView即允许水平滚动又有重用机制,所以非常适合,唯一有个缺点是:UICollectionView是不支持无限轮播的,当滚动到头就不能再滚动了,为了实现无限轮播还需要特殊处理

  1. 增加图片数组的元素,将原始图片的最后一张插入到第0个位置,将原始图片的第0个元素追加到最后

  2. 初始化时先便宜一个宽度来显示第一张图片

  3. 当用户向右滚动到最前面状态时(图一),需要偷偷的立即将当前的偏移量定位到倒数第二个图片(图二),offset.x = CGPointMake((self.images.count - 1) * ScreenWidth,0), 这样一来用户就可以能向左滚动又可以向右滚动了

  4. 当用户向右滚动到最后一张图片时(图一),需要偷偷的立即将当前偏移量定位到正数第二个位置(图二),这样用户就又可以即可以向左滑动,又可以向右滑动。


使用UICollectionView和使用UIScrollView的方式思想差不多

iOS 自定义图片无限轮播控件相关推荐

  1. 【iOS】快速集成轮播控件

    自己写的一个轮播控件,初始化后只要实现两个数据源方法,几行代码就能快速集成,支持本地图片和网络图片,支持点击事件,可定制播放速度.指示器颜色/位置.默认加载图等,效果: 1.下载地址: GitHub ...

  2. android 3d布局轮播,android 图片/视频混合轮播控件banner

    android 图片/视频混合轮播控件banner 在youth5201314的图片轮播控件做的修改 原作者github地址:https://github.com/youth5201314/banne ...

  3. BannerLayoutSimple 支持图片无限轮播的 BannerLayout,支持自定义小圆点位置以及显示位置等等,反正支持的挺多的,源码也有注释

    BannerLayoutSimple 项目地址: 7449/BannerLayoutSimple 简介:支持图片无限轮播的 BannerLayout,支持自定义小圆点位置以及显示位置等等,反正支持的挺 ...

  4. c# imager让图片有圆角unity_Qt编写自定义控件24-图片轮播控件

    一.前言 上一篇文章写的广告轮播控件,采用的传统widget堆积设置样式表做的,这次必须要用到更高级的QPainter来绘制了,这个才是最高效的办法,本控件参考雨田哥的轮播控件,经过大规模的改造而成, ...

  5. android banner加载布局,Android知识点之图片轮播控件Banner

    Rate this post 在我们来发Android项目时,经常有图片或者广告的轮播功能的需求,下面将介绍一款Android开发时使用的开源图片轮播控件Banner,同时按序讲解如何使用配置这款控件 ...

  6. iOS开发之ImageView复用实现图片无限轮播

    在上篇博客中iOS开发之多图片无缝滚动组件封装与使用给出了图片无限轮播的实现方案之一,下面在给出另一种解决方案.今天博客中要说的就是在ScrollView上贴两个ImageView, 把ImageVi ...

  7. iOS 两种不同的图片无限轮播

    代码地址如下: http://www.demodashi.com/demo/11608.html 前记 其实想写这个关于无限轮播的记录已经很久很久了,只是没什么时间,这只是一个借口,正如:时间就像海绵 ...

  8. android 图片轮播组件,Android客户端实现图片轮播控件

    本文和大家一起写一个Android图片轮播控件,供大家参考,具体内容如下 1. 轮播控件的组成部分 我们以知乎日报Android客户端的轮播控件为例,分析一下轮播控件的主要组成: 首先我们要有用来显示 ...

  9. java图片轮播_java制作广告图片自动轮播控件

    首页图片的轮播 /** * 广告图片自动轮播控件 * */ public class ImageCycleView extends LinearLayout { /** * 上下文 */ privat ...

最新文章

  1. 天猫双十一神话恐终结
  2. c# ifram 刷新父页面
  3. 进临界区(关全局中断)是否会影响数据的接收?
  4. textarea 转换 html,textarea html标签转换为纯文本
  5. STM32开发 -- 系统软复位
  6. Mac下搭建jekyll环境
  7. mysql 日志记录 archive_完美起航-Mysql日志管理、备份与恢复
  8. hog特征提取python代码_hog特征提取-python实现
  9. jq-实战之表格筛选
  10. 如何做一个高效率的程序员,对程序员也是很重要。。
  11. mysql的int最大值_MySQL中int最大值深入讲解
  12. 【MySQL】MySQL中的查询语句的详解----等值连接、左连接、右连接、全连接
  13. form input类型
  14. sql语句中case_SQL中的CASE语句
  15. 好看的按钮设计HTML+CSS,漂亮的动画设计
  16. CocoaPods 2017最新、最快安装和使用说明
  17. 音创点歌机_音创ktv点歌系统家庭版-音创KTV点歌系统下载 v3.17--pc6下载站
  18. PyTorch 实现kmax-pooling
  19. xxl-job源码解读:调度器schedule
  20. 钉钉直播 — 为什么直播屏幕共享显示黑屏?(仅针对mac端)

热门文章

  1. 舵机 - 什么是舵机
  2. 互联网公司测试组长/leader/经理如何面试社招测试工程师
  3. JAVA菜鸟驿站快递分发系统计算机毕业设计Mybatis+系统+数据库+调试部署
  4. Self2Self With Dropout: Learning Self-Supervised Denoising From Single Image【使用单张图像进行自监督学习去噪】
  5. (课堂作业)spring-boot集成shiro的步骤及代码解析
  6. 谈谈DDD(领域驱动设计)
  7. 彩色蟒蛇绘制。对 Python 蟒蛇的每个部分采用不同颜色,绘制一条彩色蟒蛇。
  8. Flash----读写外部Flash
  9. 手机敬业签App怎么快速添加便签内容?
  10. 细说华为和荣耀的关系:潮流的荣耀和稳重的华为