要实现的功能:五张图片自动+循环滚动,Page控制器跟随图片变化oop
首先先声明几个全局变量动画
//屏幕的宽 #define SCREEN_WIDTH [UIScreen mainScreen].bounds.size.width //我用的图片的尺寸是260*600,为了适应屏幕大小,等比例缩放一下 #define HEIGHT_IMAGE 260*SCREEN_WIDTH/600 @property(nonatomic,strong)UIScrollView *sc; @property(nonatomic,strong)UIPageControl*pc; @property(nonatomic,strong)NSTimer*timer;
一. UIScrollView的建立atom
手机的屏幕是有限的,当想展现的内容超过手机的屏幕范围,就须要经过手势的上下滑动来获取所有内容,UIScrollView是一个可以滚动的视图控件,它的contentSize属性就是告诉UIScrollView全部内容的尺⼨寸,也就是包含了它能滚动到的范围。spa
1.建立UIScrollView代理
self.sc=[[UIScrollView alloc]initWithFrame:CGRectMake(0, 14, SCREEN_WIDTH, HEIGHT_IMAGE)];
2.设置实际内容的Sizecode
self.sc.contentSize=CGSizeMake(SCREEN_WIDTH*5, HEIGHT_IMAGE);
3.加载图片orm
for (int i=0; i<5; i++) { //个人图片命名是以img_0+1/2/3/4/5命名的 NSString*img_name=[NSString stringWithFormat:@"img_0%d",i+1]; UIImage *image=[UIImage imageNamed:img_name]; //ImageView的X设置为每一个页面的起始横坐标 UIImageView*iv=[[UIImageView alloc]initWithFrame:CGRectMake(i*SCREEN_WIDTH, 14, SCREEN_WIDTH, HEIGHT_IMAGE)]; iv.image=image; [self.sc addSubview:iv]; }
4.设置按页滚动索引
self.sc.pagingEnabled=YES;
5.取消显示水平滚动条图片
sc.showsHorizontalScrollIndicator=NO;
二. UIPageControl的建立get
1.建立UIPageControl
self.pc=[[UIPageControl alloc]initWithFrame:CGRectMake(0, 64+HEIGHT_IMAGE-20, SCREEN_WIDTH, 20)];
2.设置总页数
pc.numberOfPages=5;
3.设置当前索引所在页数
self.pc.currentPage=0;
4.设置默认颜色
self.pc.pageIndicatorTintColor=[UIColor brownColor];
5.设置当前索引所在位置的颜色
self.pc.currentPageIndicatorTintColor=[UIColor orangeColor];
此时虽然生成了页面控制器,可是还没法跟随图片一块儿滚动
这里介绍两个UIScrollView的方法,首先添加代理
@interface ViewController ()<UIScrollViewDelegate> sc.delegate = self;
①当用户开始拖拽时响应的方法
-(void)scrollViewWillBeginDragging:(UIScrollView *)scrollView{ }
②当动画缓冲结束时相应的方法
-(void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView{ }
6.设置索引与对应页数图片一致
-(void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView{ // 当前页数=偏移量/屏幕宽度 int i= scrollView.contentOffset.x/SCREEN_WIDTH; self.pc.currentPage=i; }
三.添加计时器
推送的内容是会本身循环滚动的,不须要一直去用手势操做来获取下一页的信息。
1.建立NSTimer
// @param NSTimeInterval 倒计时 // @param target: self // @param selector : 须要响应的方法 // @param userInfo: nil // @param repeats : 是否重复倒计时 self.timer=[NSTimer timerWithTimeInterval:2 target:self selector:@selector(TimerAction) userInfo:nil repeats:YES];
2.把建立的NSTimer加入到NSRunLoop
// NSRunLoop就是APP自己的计时器 NSRunLoop*loop=[NSRunLoop mainRunLoop]; [loop addTimer:self.timer forMode:NSRunLoopCommonModes];
3.在响应的方法中设置自动滚动
-(void)TimerAction{ if (self.pc.currentPage==4) { //最后一页无法往下走,只能回到第一页 [self.sc setContentOffset:CGPointMake(0, 0) animated:NO]; self.pc.currentPage=0; }else{ //往下一页走 self.pc.currentPage++; [self.sc setContentOffset:CGPointMake(self.pc.currentPage*SCREEN_WIDTH, 0) animated:YES]; } }
4.当用户开始拖拽的时候,计时器应该消失
-(void)scrollViewWillBeginDragging:(UIScrollView *)scrollView{ //计时器中止 [self.timer invalidate]; } //自动中止后,没有再启动的方法,只有从新初始化
四.实现无限滚动
当咱们拖拽到最后一页时,再像右进行拖拽,是没有用的,依然停留在最后的页面上,同理,第一页像左拖拽也是如此。无限滚动,便可以从最后一页,像右拖拽,直接回到第一页,第一页像左拖拽,直接来到最后一页。
原理以下:要显示的五张图片记为1~5,放置七张图片,第一张为图片5,最后一张为图片1,经过偏移量设置初始显示的图片为图片1,像左拉时,经过UIScrollView的响应方法,在开始拖拽时,运用偏移量将图片跳转到倒数第二张图片(即图片5),同理可知如何实现向右无限滚动
1.修改实际内容的Size
self.sc.contentSize=CGSizeMake(SCREEN_WIDTH*7, [self heightforimage]);
2.添加7张图片,这里我为了方便我将图片名改成1~7
for (int i=0; i<7; i++) { UIImageView *iv=[[UIImageView alloc]initWithFrame:CGRectMake(SCREEN_WIDTH*i, 0, SCREEN_WIDTH, [self heightforimage])]; iv.image=[UIImage imageNamed:[NSString stringWithFormat:@"%d",i+1]]; [self.sc addSubview:iv]; }
3.设置初始偏移量
//最初显示的为图片2,即以前的图片1(这里图片2~6分别和以前的图片1~5对应) self.sc.contentOffset=CGPointMake(SCREEN_WIDTH, 0);
3.经过偏移量实现无限循环
-(void)scrollViewWillBeginDragging:(UIScrollView *)scrollView{ //当偏移量x小于屏幕时,表示即将要从图片2拖拽到图片1,这时直接跳转到倒数第二张图片(以前的图片5) if (self.sc.contentOffset.x<SCREEN_WIDTH) { self.sc.contentOffset=CGPointMake(SCREEN_WIDTH*5, 0); } if (self.sc.contentOffset.x>SCREEN_WIDTH*5) { //当偏移量x大于SCREEN_WIDTH*5时,表示即将要从图片6拖拽到图片7,这时直接跳转到正数第二张图片(以前的图片1) self.sc.contentOffset=CGPointMake(SCREEN_WIDTH, 0); } }
4..设置索引与对应页数图片一致
-(void)scrollViewDidScroll:(UIScrollView *)scrollView{ int i= scrollView.contentOffset.x/(SCREEN_WIDTH); if (i==0) { self.pc.currentPage=4; }else if(i==6){ self.pc.currentPage=0; }else{ self.pc.currentPage=i-1;} }