现在基本每一个商业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. Failure is not fatal, but failure to change might be.

    Failure is not fatal, but failure to change might be. 失败不是致命的,但无法改变却可能是致命的.

  2. fzu 2107 Hua Rong Dao(状态压缩)

    Problem 2107 Hua Rong Dao Accept: 106    Submit: 197 Time Limit: 1000 mSec    Memory Limit : 32768 K ...

  3. Hql查询结果动态组装 List(map),List(bean),List(list),List(set)等格式(转)

    1.//查询整个对象String hql="from Users";Query query = session.createQuery(hql);List<Users> ...

  4. DataTables 入门使用

    前言简述 DataTables是一个JavaScript类库,它操作HTML表格,改变表格CSS样式,增强表格功能使其更具有交互性. DataTables依赖于JQuery类库. 入门示例 环境:Da ...

  5. 【转载】shell中 dd 命令

    转载自:http://blog.chinaunix.net/uid-24958038-id-3416169.html dd if=/dev/zero of=的含义是什么? 一.dd命令的解释 dd:用 ...

  6. [转载]部署Office Web Apps Server并配置其与SharePoint 2013的集成

    Office Web Apps Server 是新的 Office 服务器产品,它提供 Word.PowerPoint.Excel 和 OneNote 的基于浏览器的版本.单个 Office Web ...

  7. Hekaton是如何影响你数据库的目标恢复时间(RTO)的

    这个周末我发现了SQL Server 2014里Hekaton的一个有趣副作用,很遗憾它会负面影响你数据库的目标恢复时间(Recovery Time Objective,RTO).你已知道,对于每个本 ...

  8. sitemesh学习笔记(1)

    最近在学习web开发的时候,发现很多的页面都存在同样的导航栏,登陆栏,js,jQuery等等相同的元素.这样就感觉开发变得好臃肿啊,并且,有时候改一个元素,就要把所有包含这个元素的页面全部重新码一遍, ...

  9. C#动态属性(.NET Framework4.5支持)

    获取方法: /* 使用方法: 1. 在web.config 的<configSections> 节点中添加 <section name="customConfigs&quo ...

  10. Qt之自定义QLineEdit右键菜单

    一.QLineEdit说明 QLineEdit是单行文本框,不同于QTextEdit,他只能显示一行文本,通常可以用作用户名.密码和搜索框等.它还提供了一些列的信号和槽,方便我们使用,有兴趣的小伙伴可 ...