现在基本每一个商业APP都会有循环滚动视图,放一些轮播广告之类的,都是放在UIScrollView之上。假如我要实现N张图片的轮播,我借鉴了几个博文,得到两种方法实现:

【第一种】:如下图(图片来源于kenshin cui‘s的博客),假如要实现3张图片轮播,我们就设置UIScrollView上的imageView为3+2个,图片顺序为31231。

初始加载UIScrollView时候,滚动到第二个imageView上。

当滚动到最后一个imageview时候,设置UIScrollView的ContentOffset到第二个imageView。

当往前滚动到第一个imageview时候,设置UIScrollView的ContentOffset到倒数第二个imageview。

具体代码如下:

 #import "ViewController.h"
//定义宏,获取屏幕宽高
#define SCREEN_WIDTH [UIScreen mainScreen].bounds.size.width
#define SCREEN_HEIGHT [UIScreen mainScreen].bounds.size.height @interface ViewController ()<UIScrollViewDelegate>
/** 滚动视图*/
@property (nonatomic,strong)UIScrollView *scrollView;
/** 图片数组*/
@property (nonatomic,strong)NSMutableArray *imageArray;
@end @implementation ViewController
//懒加载滚动视图
-(UIScrollView *)scrollView{
if (!_scrollView) {
_scrollView = [[UIScrollView alloc]init];
}
return _scrollView;
}
//懒加载图片数组
-(NSMutableArray *)imageArray{
if (!_imageArray) {
_imageArray = [NSMutableArray array];
}
return _imageArray;
} - (void)viewDidLoad {
[super viewDidLoad];
//先加载图片
[self loadImageArray];
//再设置滚动视图
[self setupScrollview];
}
//加载图片,假设有3张图片 welcome1 welcome2 welcome3
-(void)loadImageArray{
for (NSInteger i = ; i<; i++) {
UIImage *image = [UIImage imageNamed:[NSString stringWithFormat:@"welcome%ld",i+]];
[self.imageArray addObject:image];
}
}
//设置scrollview
-(void)setupScrollview{
//设置可见区域
self.scrollView.frame = self.view.bounds;
//设置容量
self.scrollView.contentSize = CGSizeMake(SCREEN_WIDTH*(self.imageArray.count + ), SCREEN_HEIGHT);
//翻页模式
self.scrollView.pagingEnabled = YES;
//代理
self.scrollView.delegate = self;
//边缘不能弹跳
self.scrollView.bounces = NO;
//隐藏水平滚动条
self.scrollView.showsHorizontalScrollIndicator = NO;
[self.view addSubview:self.scrollView];
//循环添加imageView
for (NSInteger i = ; i < self.imageArray.count + ; i++) {
UIImageView *imageView = [[UIImageView alloc]initWithFrame:CGRectMake(i *SCREEN_WIDTH, , SCREEN_WIDTH, SCREEN_HEIGHT)];
if (i == ) {//0->lastObject
imageView.image = self.imageArray.lastObject;
}else if (i == self.imageArray.count + ){//4->firstObject
imageView.image = self.imageArray.firstObject;
}else{//1->0 2->1 3->2
imageView.image = self.imageArray[i-];
}
[self.scrollView addSubview:imageView];
}
//设置初始滚动的位置为第二个imageView
self.scrollView.contentOffset = CGPointMake(SCREEN_WIDTH, );
}
//当停止滚动时候,重新设置 scrollview的ContentOffset
-(void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView{
CGPoint point = scrollView.contentOffset;
if (point.x/SCREEN_WIDTH > self.imageArray.count) {//当滚动到最后的时候
[self.scrollView setContentOffset:CGPointMake(SCREEN_WIDTH, ) animated:NO];
}else if (point.x/SCREEN_WIDTH < ){//当滚动到最前的时候
[self.scrollView setContentOffset:CGPointMake(SCREEN_WIDTH*self.imageArray.count, ) animated:NO];
}
}

可以新建项目,直接复制该代码,在loadImageArray方法里面修改成加载自己的图片,运行即可。

【第二种】:假如有100张图片或者更多,就得加载100+2个imageview,显然对性能要求就得更高,因此衍生出了第二种。

就是无论你有多少张图片,imageview始终只有3个。

无论你怎么滚动,当滚动完毕的时候,UIScrollView的ContentOffset都是中间的一个imageview。

只是我们在UIScrollView的代理方法里面不断改变每一个imageview.image的图片而已。

第二种源码我会在后续博文补充。

其实,这个循环滚动学的不是会敲代码,而是一种思路。

最后推荐一个github很好用的类似第三方类库SDCycleScrollView,星星两千多,很不错。

UIScrollView循环滚动1的更多相关文章

  1. UIScrollView 循环滚动,代码超简单

    如今非常多应用里面多多少少都用到了循环滚动,要么是图片.要么是view,或者是其它,我总结一下,写了个demo分享给大家. 先看代码之后在讲原理: 1.创建一个空的项目(这个我就不多说了). 2.加入 ...

  2. iOS之UIScrollView循环滚动

    #import "ViewController.h" #define SCREEN_WIDTH [UIScreen mainScreen].bounds.size.width #d ...

  3. 使用UIScrollView 结合 UIImageView 实现图片循环滚动

    场景: 在开发工作中,有时我们需要实现一组图片循环滚动的情况.当我们使用 UIScrollView 结合 UIImageView 来实现时,一般 UIImageView 会尽量考虑重用,下面例子是以( ...

  4. UIScrollView实现自动循环滚动广告

    实现效果如下: 功能说明: 程序运行,图片自动循环播放,采用定时器实现; 当用户用手势触摸滑动时,定时器的自动播放取消,停止触摸时,自动无限播放; 代码如下 : 采用封装视图,外部进行调用即可: 1. ...

  5. IOS实现自动循环滚动广告--ScrollView的优化和封装

    一.问题分析 在许多App中,我们都会见到循环滚动的视图,比如广告,其实想实现这个功能并不难,用ScrollView就可以轻松完成,但是在制作的过程中还存在几个小问题,如果能够正确的处理好这些小问题, ...

  6. NGUI实现的一套不同大小 Item 的循环滚动代码

    测试: 数据 & Item  的 Ctrl : using UnityEngine; public class ScrollViewItemData { public int index; p ...

  7. Jquery制作--循环滚动列表

    自己模仿JQ插件的写法写了一个循环滚动列表插件,支持自定义上.下.左.右四个方向,支持平滑滚动或者间断滚动两种方式,都是通过参数设置.JQ里面有些重复的地方,暂时没想到更好的方法去精简.不过效果还是可 ...

  8. UIScrollView无法滚动的解决办法

    如果UIScrollView无法滚动,可能是以下原因: 没有设置contentSize scrollEnabled = NO 没有接收到触摸事件:userInteractionEnabled = NO ...

  9. UIScrollView无法滚动的解决办法及UIScrollView的代理(delegate)

    1•如果UIScrollView无法滚动,可能是以下原因: Ø没有设置contentSize ØscrollEnabled = NO Ø没有接收到触摸事件:userInteractionEnabled ...

随机推荐

  1. Pass云Docker介绍

    1.Docker 简介 Docker是一个开源可以将任何应用包装在”LXC容器”中运行的工具.如果说VMware,KVM包装的虚拟机,Docker包装的是应用.是一个实至名归的PaaS. 当应用被打包 ...

  2. 推荐几款很棒的 JavaScript 表单美化和验证插件

    表单元素让人爱恨交加.作为网页最重要的组成部分,表单几乎无处不在,从简单的邮件订阅.登陆注册到复杂的需要多页填写的信息提交功能,表单都让开发者花费了大量的时间和精力去处理,以期实现好用又漂亮的表单功能 ...

  3. LeetCode—— Median of Two Sorted Arrays

    Description: There are two sorted arrays nums1 and nums2 of size m and n respectively. Find the medi ...

  4. js中this的四种调用模式

    <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/ ...

  5. 100行JS实现HTML5的3D贪吃蛇游戏

    js1k.com收集了小于1k的javascript小例子,里面有很多很炫很酷的游戏和特效,今年规则又增加了新花样,传统的classic类型基础上又增加了WebGL类型,以及允许增加到2K的++类型, ...

  6. 新手学习Cocoapods教程

    CocoaPods简介 当你开发iOS应用时,会经常使用到很多第三方开源类库,比如AFNetWorking等等.手动去下载所需类库十分麻烦.另外一种常见情况是,你项目中用到的类库有更新,你必须得重新下 ...

  7. Struts2 之 实现文件上传和下载

    Struts2  之 实现文件上传和下载 必须要引入的jar commons-fileupload-1.3.1.jar commons-io-2.2.jar 01.文件上传需要分别在struts.xm ...

  8. 虚拟机service network restart没有反应解决方法

      一般我们新copy的虚拟机或新克隆的虚拟机第一次启动时都会出现没有ip地址的情况: [root@zejin243 network-scripts]# ifconfig lo        Link ...

  9. Microsecond and Millisecond C# Timer[转]

    文章转至:http://www.codeproject.com/Articles/98346/Microsecond-and-Millisecond-NET-Timer IntroductionAny ...

  10. 不可或缺 Windows Native (10) - C 语言: 文件

    [源码下载] 不可或缺 Windows Native (10) - C 语言: 文件 作者:webabcd 介绍不可或缺 Windows Native 之 C 语言 文件 示例cFile.h #ifn ...