UIScrollView + 多张 ImageView 实现轮播

实现原理:

将所有图片的名字储存在数组 imageAry 中,imageAry 的元素个数为 num,在 scrollView 上添加 num + 1 个 UIImageView,第一个 imageView 上放最后一张图片,第二个 imageView 上放第一张图片,依次类推,最后一个 imageView 上的图片和第一个 imageView 的图片相同,用来过渡。在初始状态将 scrollView 的 contentOffset 的 x 值设为一个屏幕的宽度。

代码如下:

for (NSInteger i = 0; i < count + 1; i++) {
UIImageView *imageView = [[UIImageView alloc] initWithFrame:CGRectMake(i * DEVICE_WIDTH, 0, DEVICE_WIDTH, 500)];
NSString *imageName = self.imageAry[count-1];
if (i != 0) {
imageName = self.imageAry[i-1];
}
imageView.image = [UIImage imageNamed:imageName];
[self.scrollView addSubview:imageView];
}
  1. 手动轮播

    当手动滚动到倒数第二张图片,继续向右滚动时,设置 scrollView 的 contentOffset 的 x 值为 0,并不做动画,实现自然过渡到第一个 imageView,显示最后一张图片。

    当手动滚动到第一个 imageView,继续向左滚动时,设置 scrollView 的 contentOffset 的 x 值为图片的总个数乘以屏幕的宽度,并不做动画,实现自然过渡到最后一个 imageView,显示的也是最后一张图片。

    代码如下:

    - (void)scrollViewDidScroll:(UIScrollView *)scrollView {
    CGFloat offsetX = scrollView.contentOffset.x;
    NSInteger count = self.imageAry.count;
    if (offsetX < 0) {
    [scrollView setContentOffset:CGPointMake(count * DEVICE_WIDTH, 0) animated:NO];
    } else if (offsetX > count * DEVICE_WIDTH) {
    [scrollView setContentOffset:CGPointMake(0, 0) animated:NO];
    }
    }
  2. 自动轮播

    当自动滚动到倒数第二张图片,继续向右滚动时,设置 scrollView 的 contentOffset 的 x 值为 0,并不做动画,紧接着设置 scrollView 的 contentOffset 的 x 值为屏幕的宽度,并做动画,实现从最后一个 imageView 到第一个 imageView 的自然过渡。

    代码如下:

    - (void)autoPlay {
    [super autoPlay];
    CGFloat offsetX = self.scrollView.contentOffset.x;
    NSInteger count = self.imageAry.count;
    CGFloat imageViewX = DEVICE_WIDTH;
    if (offsetX > (count - 1) * DEVICE_WIDTH) {
    [self.scrollView setContentOffset:CGPointMake(0, 0) animated:NO];
    } else {
    imageViewX += offsetX;
    }
    [self.scrollView setContentOffset:CGPointMake(imageViewX, 0) animated:YES];
    }

UIScrollView + 3 张 ImageView 实现轮播

实现原理:

将所有图片的名字储存在数组 imageAry 中,imageAry 的元素个数为 num,在 scrollView 上添加 3 个 UIImageView,第一个 imageView 上放最后一张图片,第二个 imageView 上放第一张图片,第三个 imageView 上放第二张图片。在初始状态将 scrollView 的 contentOffset 的 x 值设为一个屏幕的宽度,即显示的是中间的 imageView。

代码如下:

for (NSInteger i = 0; i < 3; i++) {
UIImageView *imageView = [[UIImageView alloc] initWithFrame:CGRectMake(i * DEVICE_WIDTH, 0, DEVICE_WIDTH, 500)];
NSString *imageName = self.imageAry[count-1];
if (i != 0) {
imageName = self.imageAry[i-1];
}
imageView.image = [UIImage imageNamed:imageName];
[self.scrollView addSubview:imageView];
}
  1. 手动轮播

    当 scrollView 的 contentOffset 的 x 值为 0 时,减小 pageControl 的 currentPage(如果 currentPage 为 0,则设置 currentPage 为最大)。

    当 scrollView 的 contentOffset 的 x 值为 2 倍的屏幕宽度时,变大 pageControl 的 currentPage(如果 currentPage 为最大,则设置 currentPage 为 0)。

    然后根据 currentPage 从数组中取出图片给 imageView 赋值。

    最后将 scrollView 的 contentOffset 的 x 值恢复到一个屏幕的宽度,且不做动画,即始终显示中间的 imageView。

    代码如下:

    - (void)scrollViewDidScroll:(UIScrollView *)scrollView {
    CGFloat offsetX = scrollView.contentOffset.x;
    if (offsetX == 0) {
    [self currentPageDown];
    [self resetImagesAndContentOffset];
    } else if (offsetX == 2 * DEVICE_WIDTH) {
    [self currentPageUp];
    [self resetImagesAndContentOffset];
    }
    } - (void)currentPageDown {
    NSInteger count = self.imageAry.count;
    NSInteger currentIndex = (self.pageControl.currentPage - 1 + count) % count;
    self.pageControl.currentPage = currentIndex;
    } - (void)currentPageUp {
    NSInteger currentIndex = (self.pageControl.currentPage + 1) % self.imageAry.count;
    self.pageControl.currentPage = currentIndex;
    } - (void)resetImagesAndContentOffset {
    NSInteger currentPage = self.pageControl.currentPage;
    NSInteger count = self.imageAry.count;
    for (NSInteger i = 0; i < 3; i++) {
    UIImageView *imageView = self.scrollView.subviews[i];
    NSInteger imageIndex = 0;
    switch (i) {
    case 0:
    imageIndex = currentPage - 1;
    if (imageIndex < 0) {
    imageIndex = count - 1;
    }
    break;
    case 1:
    imageIndex = currentPage;
    break;
    case 2:
    imageIndex = currentPage + 1;
    if (imageIndex > count - 1) {
    imageIndex = 0;
    }
    break;
    }
    imageView.image = [UIImage imageNamed:self.imageAry[imageIndex]];
    }
    [self.scrollView setContentOffset:CGPointMake(DEVICE_WIDTH, 0) animated:NO];
    }
  2. 自动轮播

    设置 scrollView 的 contentOffset 的 x 值为 2 倍的屏幕宽即可。

    代码如下:

    - (void)autoPlay {
    [super autoPlay];
    [self.scrollView setContentOffset:CGPointMake(2 * DEVICE_WIDTH, 0) animated:YES];
    }

Demo 下载

iOS -- 轮播图的更多相关文章

  1. 一步一步拆解一个简单的iOS轮播图(三图)

    导言(可以不看): 不吹不黑,也许是东半球最简单的iOS轮播图拆分注释(讲解不敢当)了(tree new bee).(一句话包含两个人,你能猜到有谁吗?提示:一个在卖手机,一个最近在卖书)哈哈... ...

  2. IOS轮播图

    轮播图播放的主要技术在于: cell的封装.这里采用UICollectionViewCell实现. #import <UIKit/UIKit.h> @interface CircleVie ...

  3. ReactNative新手学习之路04 组件化开发轮播图swiper支持安卓和IOS

    react native 新手之路04 组件化开发轮播图swiper支持安卓和IOS npm install react-native-carousel --save git 地址Properties ...

  4. iOS 图片轮播图(自动滚动)

    iOS 图片轮播图(自动滚动) #import "DDViewController.h" #define DDImageCount 5 @interface DDViewContr ...

  5. iOS回顾笔记(05) -- 手把手教你封装一个广告轮播图框架

    html,body,div,span,applet,object,iframe,h1,h2,h3,h4,h5,h6,p,blockquote,pre,a,abbr,acronym,address,bi ...

  6. iOS最笨的办法实现无限轮播图(网络加载)

    iOS最笨的办法实现无限轮播图(网络加载) 简单的做了一下: 使用方法: 把 请求返回的 图片地址(字符串类型)放进数组中就行 可以使用SDWebImage(我就是用的这个)等..需要自己导入并引用, ...

  7. iOS开发之 用第三方类库实现轮播图

    在github上面有很多的第三方类库,大大节约了大家的开发时间 下载地址:https://github.com/gsdios/SDCycleScrollView 现已支持cocoapods导入:pod ...

  8. iOS中 轮播图放哪最合适? 技术分享

    我们知道,轮播图放在cell或collectionViewCell上会影响用户层级交互事件,并且实现起来比较麻烦,现在推出一个技术点:答题思路是:将UIScrollView放在UIView或UICol ...

  9. iOS swift版本无限滚动轮播图

    之前写过oc版本的无限滚动轮播图,现在来一个swift版本全部使用snapKit布局,数字还是pageConrrol样式可选 enum typeStyle: Int { case pageContro ...

随机推荐

  1. ABP理论之CSRF

    返回总目录 本篇目录 介绍 ASP.NET MVC ASP.NET WEB API ASP.NET Core[以后补上] 客户端类库 内部原理 介绍 CSRF[Cross-Site Request F ...

  2. [PHP源码阅读]empty和isset函数

    近日被问到PHP中empty和isset函数时怎么判断变量的,刚开始我是一脸懵逼的,因为我自己也只是一知半解,为了弄懂其真正的原理,赶紧翻开源码研究研究.经过分析可发现两个函数调用的都是同一个函数,因 ...

  3. Redux初见

    说到redux可能我们都先知道了react,但我发现,关于react相关的学习资料很多,也有各种各样的种类,但是关于redux简单易懂的资料却比较少. 这里记录一下自己的学习理解,希望可以简洁易懂,入 ...

  4. ASP.NET Core 1.1 Preview 1 简介(包含.NETCore 1.1升级公告)

    ASP.NET Core 1.1 Preview 1于2016年10月25日发布.这个版本包括许多伟大的新功能以及许多错误修复和一般的增强. 要将现有项目更新到ASP.NET Core 1.1 Pre ...

  5. 解析大型.NET ERP系统 自动更新

    C/S架构的应用程序需要支持自动更新功能,当新版本程序发布后,正在运行的客户端能检测到新版本的程序,通知用户是否下载更新.工作以来参与过几个自动更新模块的设计与维护,撰文总结自动更新模块设计与实现. ...

  6. Bootstrap3系列:输入框组

    1. 基本实例 通过在文本输入框 <input> 前面.后面或是两边加上文字或按钮,实现对表单控件的扩展. .input-group包含.input-group-addon给 .form- ...

  7. 快速打造跨平台开发环境 vagrant + virtualbox + box

    工欲善其事必先利其器,开发环境 和 开发工具 就是 我们开发人员的剑,所以我们需要一个快并且好用的剑 刚开始做开发的时候的都是把开发环境 配置在 自己的电脑上,随着后面我们接触的东西越来越多,慢慢的电 ...

  8. Ubuntu 14.04 下安装wiznote客户端

    由于使用wiz官方的方法编译出的客户端无法输入中文,而用apt-get安装的wiz版本又太老, 所以我找到了2.3.2.4版本的wiznote, 用着还可以(支持代码高亮),下面是对应的deb包的链接 ...

  9. 外边距塌陷之clearance

    在一个BFC中,垂直方向上相邻的块级盒子产生外边距塌陷,本文要说一个特殊的外边距塌陷情况,即当垂直方向上,两个块级盒子之间有个浮动元素相隔时,这个时候会产生什么样的效果呢? .outer{ overf ...

  10. .NET Core全面扫盲贴

    标签: .NETCore Asp.NETCore 1. 前言 2. .NET Core 简介 2.1 .NET Core是什么 2.2 .NET Core的组成 2.3 .NET Core的特性 2. ...