iOS --UIScrollView的学习(三)自动轮播

1、前面两章讲的都是基本的用法,这次讲一下比较重要的功能分页和自动播放

2、UIPageControl--分页

2.1只要将UIScrollView的pageEnabled属性设置为YES,UIScrollView会被分割成多个独立页面,里面的内容就能进行分页展示,一般会配合UIPageControl增强分页效果,UIPageControl常用属性如下 

1)一共有多少页

@property(nonatomic) NSInteger numberOfPages;

2)当前显示的页码

@property(nonatomic) NSInteger currentPage; 

 3)只有一页时,是否需要隐藏页码指示器

@property(nonatomic) BOOL hidesForSinglePage; 

4)其他页码指示器的颜色

@property(nonatomic,retain) UIColor *pageIndicatorTintColor;

5)当前页码指示器的颜色

@property(nonatomic,retain) UIColor *currentPageIndicatorTintColor;

3、NSTimer

3.1、NSTimer叫做“定时器”,它的作用如下:

1)在指定的时间执行指定的任务

2)每隔一段时间执行指定的任务

3.2、调用下面的方法就会开启一个定时任务

+ (NSTimer *)scheduledTimerWithTimeInterval:(NSTimeInterval)ti target:(id)aTarget 

selector:(SEL)aSelector 

userInfo:(id)userInfo 

repeats:(BOOL)yesOrNo;

每隔ti秒,调用一次aTarget的aSelector方法,yesOrNo决定了是否重复执行这个任务

3.3、通过invalidate方法可以停止定时器的工作,一旦定时器被停止了,就不能再次执行任务。只能再创建一个新的定时器才能执行新的任务

- (void)invalidate;

4、大体思路:

在前面+最后一张,在最后面+第一张,也就是说如果你有三张图片的话在第0个位置放最后一张,在第4个位置放第一张,总共的contentsize是imageNum+ 2。

代码如下:

  1 - (void)viewDidLoad {
  2     [super viewDidLoad];
  3     //初始化scrollView
  4     [self setupScrollView];
  5     //初始化pageControl
  6     [self setupPageControl];
  7 }
  8 - (void)setupScrollView
  9 {
 10     _fzhScrollView = [[UIScrollView alloc]initWithFrame:CGRectMake(0, 64, SCREEN_WIDTH, 200)];
 11     
 12     _fzhScrollView.contentSize = CGSizeMake(SCREEN_WIDTH * (imageNum +2) , 0);
 13     
 14     for (int i = 0; i<imageNum + 2; i++) {
 15         UIImageView * imageView = [[UIImageView alloc]initWithFrame:CGRectMake(i * SCREEN_WIDTH, 64, SCREEN_WIDTH, 200)];
 16         if (i == 0) {
 17             imageView.image = [UIImage imageNamed:@"3.jpg"];
 18         }else if (i == imageNum + 1){
 19             imageView.image = [UIImage imageNamed:@"1.jpg"];
 20         }else{
 21             imageView.image = [UIImage imageNamed:[NSString stringWithFormat:@"%d.jpg",i]];
 22         }
 23         [_fzhScrollView addSubview:imageView];
 24     }
 25     
 26     _fzhScrollView.contentOffset = CGPointMake(SCREEN_WIDTH, 0);
 27     _fzhScrollView.bounces = NO;
 28     _fzhScrollView.showsHorizontalScrollIndicator = NO;
 29     _fzhScrollView.pagingEnabled = YES;
 30     _fzhScrollView.delegate = self;
 31     //添加定时器
 32     [self addTimer];
 33     [self.view addSubview:_fzhScrollView];
 34     
 35 }
 36 /**
 37  *  添加定时器
 38  */
 39 - (void)addTimer
 40 {
 41     self.timer = [NSTimer scheduledTimerWithTimeInterval:2.0 target:self selector:@selector(nextImage) userInfo:nil repeats:YES];
 42     [[NSRunLoop currentRunLoop] addTimer:self.timer forMode:NSRunLoopCommonModes];
 43 }
 44 /**
 45  *  移除定时器
 46  */
 47 - (void)removeTimer
 48 {
 49     [self.timer invalidate];
 50     self.timer = nil;
 51 }
 52 - (void)nextImage
 53 {
 54     //1.计算page
 55     int page = 0;
 56     if (_pageCtl.currentPage == imageNum - 1) {
 57         page = 0;
 58     } else {
 59         page = (int)_pageCtl.currentPage + 1;
 60     }
 61     //如果在第0个位置,把滑动位置设置为最后一张
 62     if (_fzhScrollView.contentOffset.x == 0) {
 63         _fzhScrollView.contentOffset = CGPointMake(imageNum * SCREEN_WIDTH, 0);
 64         //如果在第imageNum + 1个位置,把滑动位置设置为第一张
 65     }else if (_fzhScrollView.contentOffset.x == (imageNum + 1) * SCREEN_WIDTH){
 66         _fzhScrollView.contentOffset = CGPointMake(SCREEN_WIDTH, 0);
 67     }else{
 68         CGFloat offsetX = _fzhScrollView.contentOffset.x;
 69         offsetX  = offsetX + SCREEN_WIDTH;
 70          _fzhScrollView.contentOffset = CGPointMake(offsetX, 0);
 71     }
 72 }
 73 //创建分页控制器
 74 - (void)setupPageControl
 75 {
 76     _pageCtl = [[UIPageControl alloc]initWithFrame:CGRectMake(0, 400, SCREEN_WIDTH, 60)];
 77     
 78     _pageCtl.numberOfPages = imageNum;
 79     
 80     _pageCtl.backgroundColor = [UIColor blackColor];
 81     
 82     [self.view addSubview:_pageCtl];
 83     
 84 }
 85 
 86 #pragma mark ---UIScrollViewDelegate
 87 /**
 88  *  当scrollView正在滚动就会调用
 89  */
 90 - (void)scrollViewDidScroll:(UIScrollView *)scrollView
 91 {
 92     //如果在第0个位置,把滑动位置设置为最后一张
 93     if (_fzhScrollView.contentOffset.x == 0) {
 94         _fzhScrollView.contentOffset = CGPointMake(imageNum * SCREEN_WIDTH, 0);
 95         _pageCtl.currentPage = imageNum;
 96         //如果在第imageNum + 1个位置,把滑动位置设置为第一张
 97     }else if (_fzhScrollView.contentOffset.x == (imageNum + 1) * SCREEN_WIDTH){
 98         _fzhScrollView.contentOffset = CGPointMake(SCREEN_WIDTH, 0);
 99         _pageCtl.currentPage = 0;
100     }else{
101         
102         _pageCtl.currentPage = (scrollView.contentOffset.x + SCREEN_WIDTH * 0.5)/SCREEN_WIDTH -1;
103     }
104     
105 }
106 /**
107  *  开始拖拽的时候调用
108  */
109 - (void)scrollViewWillBeginDragging:(UIScrollView *)scrollView
110 {
111     // 停止定时器(一旦定时器停止了,就不能再使用)
112     [self removeTimer];
113 }
114 
115 /**
116  *  停止拖拽的时候调用
117  */
118 - (void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate
119 {
120     // 开启定时器
121     [self addTimer];
122 }

demo:下载地址:https://github.com/fengzhihao123/FZHAutoScrollView;

tip:如果出现图片不存在的错误,自己再拖拽进3张图片修改一下名称即可!

原文地址:https://www.cnblogs.com/fengzhihao/p/5288086.html