基于ScrollerView上的滚动视图,自动轮播及pageController控制图片

1,实现图片轮播需要设置scrollerView 的contentSize 进而通过控制scrollerView的ContentSize实现图片的播放

2,实现图片的循环播放其实是在轮播的图片首尾各添加一张图片,之后利用时间差来实现图片的循环播放

3,运用的组件包括 :

        a:UIScrollerView

        b:NSTimer

        c:UIPageControl 

一,首先创建一个单一的Single View Application

二,在ViewController.m里面进行声明

1 {
2     UIScrollView * scrView;
3     NSTimer * timer;      //第一个定时器
4     UIPageControl * pageCon;  //页面控制器
5     NSTimer * timer2; //第二个定时器
6 }

因为项目中用到屏幕的宽的地方比较多,所以我们进行宏定义 

SCREENWIDTH

 1 #define SCREENWIDTH self.view.frame.size.width 

三,在viewDidLoad里面创建

 1 - (void)viewDidLoad {
 2     [super viewDidLoad];
 3     
 4     scrView = [[UIScrollView alloc]initWithFrame:CGRectMake(0, 20, SCREENWIDTH, 150)];
 5     scrView.delegate = self;  //设置scrollerView的代理
 6     scrView.contentSize = CGSizeMake(SCREENWIDTH * 7, 150); //因项目中是用的5张图片进行循环轮播,所以我们要在首尾各添加一张图片,在第一张图片之前添加第五张图片,在第五章图片之后添加第一张图片  image0和image5是一张图片  image6和image1是一张图片
 7     [self.view addSubview:scrView];
 8     scrView.pagingEnabled = YES; //设置分页
 9     
10 //在scrollerView内部循环创建7张图片
11     for (int i = 0 ; i <7; i ++) {
12         UIImageView * imgView = [[UIImageView alloc]initWithFrame:CGRectMake(i * SCREENWIDTH, 0, SCREENWIDTH, 150)];
13         imgView.image = [UIImage imageNamed:[NSString stringWithFormat:@"image%d",i]];
14         [scrView addSubview:imgView];
15     }
16     
17     [scrView setContentOffset:CGPointMake(SCREENWIDTH, 0)];//设置第二张图片在屏幕中显示,这个就是我们要的第一章图片
18     timer = [NSTimer scheduledTimerWithTimeInterval:2 target:self selector:@selector(runLoop) userInfo:nil repeats:YES];//添加定时器
19     
20     
21     pageCon = [[UIPageControl alloc]initWithFrame:CGRectMake(SCREENWIDTH - 200, 130, 200, 40)]; //创建页面控制器
22     pageCon.numberOfPages = 5;
23     pageCon.currentPageIndicatorTintColor = [UIColor redColor]; 
24     pageCon.pageIndicatorTintColor = [UIColor blueColor];
25     pageCon.currentPage = 0;
26     [pageCon addTarget:self action:@selector(pageClick) forControlEvents:UIControlEventValueChanged];
27     [self.view addSubview:pageCon];
28 }

四,首先实现UIScrollerView的代理协议

 1 @interface ViewController ()<UIScrollViewDelegate>
 2 #pragma mark - UIScrollerViewDelegate协议方法
 3 - (void)scrollViewDidScroll:(UIScrollView *)scrollView{
 4     //scrollView滚动的时候
 5     if (scrView.contentOffset.x == 6 * SCREENWIDTH) {
 6         [scrView setContentOffset:CGPointMake(SCREENWIDTH, 0)animated:NO];
 7     } //如果当scrollerview的偏移到第五张图片的时候 ,设置scrollerView偏移到第一张图片,记得动画效果一定要设置为NO ,不然不会实现循环播放效果
 8     pageCon.currentPage = (scrView.contentOffset.x - SCREENWIDTH)/SCREENWIDTH;  //设置页数控制器的指示页数跟着,图片的循环而变化
 9 }
10 - (void)scrollViewWillBeginDragging:(UIScrollView *)scrollView{
11     //开始拖拽
12     [timer invalidate]; //开始拖拽的时候使定时器作废
13 }
14 - (void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate{
15     //结束拖拽
16 }
17 - (void)scrollViewWillBeginDecelerating:(UIScrollView *)scrollView{
18     //开始减速的时候
19     [timer invalidate]; //开始减速的时候也要设置定时器作废 ,不然的话如果图片在轮播的时候你直接点击不进行拖拽,会出现 bug
20 } 
21 
22 - (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView{
23     //结束减速
24     timer = [NSTimer scheduledTimerWithTimeInterval:2 target:self selector:@selector(runLoop) userInfo:nil repeats:YES]; //当图片结束动作的时候添加定时器
25 }

五,首先实现页数控制器的点击方法

1 -(void)pageClick{
2     [timer invalidate];  //当点击分页控制器的时候,使timer定时器失效
3     [scrView setContentOffset:CGPointMake((pageCon.currentPage +1) * SCREENWIDTH, 0)]; //设置scrollerView的偏移量根据页数控制器的变化而变化
4     timer2 = [NSTimer scheduledTimerWithTimeInterval:0 target:self selector:@selector(looploop) userInfo:nil repeats:NO]; //创建另外一个定时器 ,
5 }

六,实现定时器timer2的方法效果

 1 -(void)looploop{

2 timer = [NSTimer scheduledTimerWithTimeInterval:2 target:self selector:@selector(runLoop) userInfo:nil repeats:YES];

3 } 

七,实现定时器timer的方法

1 -(void)runLoop{
2     [timer2 invalidate];
3     [scrView setContentOffset:CGPointMake(scrView.contentOffset.x + SCREENWIDTH, 0) animated:YES];
4     
5 }

在这里要说明一下为什么要创建2个定时器,如果不创建第二个定时器,我们点击pageControl的时候timer也就是第一个定时器他还是在工作的,这样当我们点击的时候出现的效果不是很好,我们创建2个定时器的话就可以避免这种情况,记得要在第一个定时器里面设置第二个定时器作废!!!!!

之后我们的效果就实现了

看一下静态效果(只能看静态效果了,视屏不会传)

祝大家早日成大牛...

原文地址:https://www.cnblogs.com/JustForHappy/p/5711602.html