UIScrollView配合定时器和手动实现图片轮播无限循环

来源:互联网 发布:电信网络在线测速 编辑:程序博客网 时间:2024/05/20 00:15

研究了两天半时间,新手无奈啊,话不多说,直接上代码。

#import "TestViewController.h"


#define s_x [UIScreen mainScreen].bounds.size.width

#define s_y [UIScreen mainScreen].bounds.size.height

NSArray * imagearr;

NSTimer * timer;

int _currentImageIndex;

@interface TestViewController ()<UIScrollViewDelegate>

@property (nonatomic,retain)UIScrollView * scv;

@property (nonatomic,retain)UIPageControl * page;

@property (nonatomic,retain)UIImageView * leftimageview;

@property (nonatomic,retain)UIImageView * centerimageview;

@property (nonatomic,retain)UIImageView * rightimageview;


@end


@implementation TestViewController


- (void)viewDidLoad {

    [superviewDidLoad];

    // Do any additional setup after loading the view.

    self.view.backgroundColor=[UIColorwhiteColor];

    imagearr=@[@"0.jpg",@"1.jpg",@"2.jpg",@"3.jpg",@"4.jpg",@"5.jpg"];


    [selfmainView];

    

    [selfsetimageview];

    

    [selfsetDefaultImage];

    

    [selfsettimer];

    

}

-(void)settimer{

    timer=[NSTimerscheduledTimerWithTimeInterval:3target:selfselector:@selector(timechanged)userInfo:nilrepeats:YES];

    NSLog(@"定时器启动");

    [[NSRunLoopcurrentRunLoop]addTimer:timerforMode:NSRunLoopCommonModes];

}

-(void)timechanged{

    int leftimageindex,rightimageindex;

    CGPoint offset=[_scvcontentOffset];//内容视图的位置

    //滑动发生后,实时变化图片加载,所以最先考虑的是图片的索引变化

    _currentImageIndex=(_currentImageIndex +1 )%imagearr.count;


    _centerimageview.image=[UIImageimageNamed:[NSStringstringWithFormat:@"%d.jpg",_currentImageIndex]];

    //重新设置左右图片

    leftimageindex=(_currentImageIndex+imagearr.count-1)%imagearr.count;

    rightimageindex=(_currentImageIndex +1)%imagearr.count;

    _leftimageview.image=[UIImageimageNamed:[NSStringstringWithFormat:@"%d.jpg",leftimageindex]];

    _rightimageview.image=[UIImageimageNamed:[NSStringstringWithFormat:@"%d.jpg",rightimageindex]];


    

    _page.currentPage=_currentImageIndex;

    [_scvsetContentOffset:CGPointMake(s_x,0)animated:YES];

}

#pragma mark 添加控件scrollpagecontrol

-(void)mainView{

    _scv=[[UIScrollViewalloc]init];

    _scv.frame=CGRectMake(0,0,s_x,s_y);

    _scv.contentSize=CGSizeMake(s_x * imagearr.count,0);

    //设置默认显示为s_x的地段,为默认centerimageview的位置

    [_scvsetContentOffset:CGPointMake(s_x,0)];

    //取消显示侧边滑动条

    _scv.showsHorizontalScrollIndicator=NO;

    _scv.showsVerticalScrollIndicator=NO;

    //设置整页滑动

    _scv.pagingEnabled=YES;

    //设置回弹

    _scv.bounces=YES;

    _scv.delegate=self;

    [self.viewaddSubview:_scv];

    

    _page=[UIPageControlnew];

    _page.currentPage=0;

    _page.numberOfPages=imagearr.count;

    _page.center=CGPointMake(s_x/2,s_y-100);

    _page.pageIndicatorTintColor=[UIColorcolorWithRed:0.021green:1.000blue:0.146alpha:1.000];

    [self.viewaddSubview:_page];

    

}

#pragma mark 设置imageview控件

-(void)setimageview{

    _leftimageview=[UIImageViewnew];

    _leftimageview.frame=CGRectMake(0,0,s_x,s_y);

    _leftimageview.backgroundColor=[UIColorgreenColor];

    _leftimageview.contentMode=UIViewContentModeScaleAspectFill;

    [_scvaddSubview:_leftimageview];

    

    _centerimageview=[UIImageViewnew];

    _centerimageview.frame=CGRectMake(s_x,0,s_x,s_y);

    _centerimageview.backgroundColor=[UIColorcolorWithRed:1.000green:0.453blue:0.688alpha:1.000];

    _centerimageview.contentMode=UIViewContentModeScaleAspectFill;

    [_scvaddSubview:_centerimageview];

    

    _rightimageview=[UIImageViewnew];

    _rightimageview.frame=CGRectMake(2*s_x,0,s_x,s_y);

    _rightimageview.backgroundColor=[UIColororangeColor];

    _rightimageview.contentMode=UIViewContentModeScaleAspectFill;

    [_scvaddSubview:_rightimageview];

    

    

}

#pragma mark 设置默认显示图片

-(void)setDefaultImage{

    _leftimageview.image=[UIImageimageNamed:imagearr[imagearr.count-1]];//左边显示最后一张、

    _centerimageview.image=[UIImageimageNamed:imagearr[0]];

    _rightimageview.image=[UIImageimageNamed:imagearr[1]];

    

    _currentImageIndex=0;

    _page.currentPage=_currentImageIndex;

}

#pragma mark 根据滑动的方向来判定图片如何加载

-(void)ReloadImage{

    int leftimageindex,rightimageindex;

    CGPoint offset=[_scvcontentOffset];//内容视图的位置

    if (offset.x>s_x) {//右滑

        //滑动发生后,实时变化图片加载,所以最先考虑的是图片的索引变化

        _currentImageIndex=(_currentImageIndex +1 )%imagearr.count;

        

    }

    if (offset.x<s_x) {//左滑

    /* ******************************************这个判断是重点  */

        _currentImageIndex=(_currentImageIndex +(imagearr.count-1))%imagearr.count;

    }

    

    _centerimageview.image=[UIImageimageNamed:[NSStringstringWithFormat:@"%d.jpg",_currentImageIndex]];

    //重新设置左右图片

    leftimageindex=(_currentImageIndex+imagearr.count-1)%imagearr.count;

    rightimageindex=(_currentImageIndex +1)%imagearr.count;

    _leftimageview.image=[UIImageimageNamed:[NSStringstringWithFormat:@"%d.jpg",leftimageindex]];

    _rightimageview.image=[UIImageimageNamed:[NSStringstringWithFormat:@"%d.jpg",rightimageindex]];

}

-(void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView{

    //调用重新加载图片的方法

    [selfReloadImage];

    //移动到中间

    [_scvsetContentOffset:CGPointMake(s_x,0)];

    _page.currentPage=_currentImageIndex;

    

    

    

}

-(void)scrollViewWillBeginDragging:(UIScrollView *)scrollView{

    NSLog(@"开始拖动");

    [timerinvalidate];

}

-(void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate{

    NSLog(@"拖动结束");

    [selfsettimer];

}

这样就可以实现 当点击拖动图片时,计时器会停止计时,待拖动结束后,计时器重新计时。

原理:3个imageview位置不变,始终显示中间的centerimageview,而left和right始终预先计算并加载要显示的图片。这样拖动时会实现循环效果,而计时器那边也是如此

其他的例如从网络获取图片,图片点击事件等等,还没写,不过都是很简单的东西,希望对各位有帮助,这段代码拿过去直接就能用
0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 为什么打开百度网盘的速度慢怎么办 百度网盘限制了我的宽带速度怎么办 联通信号很好但网速特别慢怎么办 苹果手机版本低下载不了软件怎么办 国内的手机要上推特和油管要怎么办 推特注册了卡在手机号怎么办 腾讯微信登录的账号密码忘了怎么办 打开手机浏览器自动跳到网页怎么办 游戏包解压后找不到启动的怎么办? 每次都要解压一次才能运行怎么办 误冲了王者荣耀点劵怎么办 机顶盒上开通的vip手机上怎么办 王者荣耀以前玩的区找不到了怎么办 电脑分辨率调高了游戏进不去怎么办 键盘语言更改后进不去系统怎么办 高尔夫旅行款 被锁在车内怎么办 在天猫买东西垫付的运费不退怎么办 天猫店一口价定价定低了怎么办 服务器开机账号改了密码忘了怎么办 小米儿童电话手表开不开机怎么办? 上海拍牌超过5次违章怎么办 拍拍贷不能更新还不了款怎么办 起诉网贷平台不知道地址怎么办 网贷不知道在哪个平台借的怎么办 车过户后出现问题车主不承认怎么办 卖了车买家一直不过户怎么办 我的车卖了但是买家不过户怎么办 如果买家拍了赠品但联系不上怎么办 淘宝产品处罚下架顾客退货怎么办 生源地贷款续贷密码忘了怎么办 助学贷款续贷密码忘了怎么办 京东上回收东西如果是坏的怎么办 58.同城找的工作被骗了怎么办 京东第三方买了二手机怎么办 手机无法显示百度视频的视频怎么办 如果微信被盗号朋友钱被骗怎么办 绑定银行卡的电话号码换了怎么办办 银行卡绑定的手机号空号了怎么办 微信提示绑定银行卡次数超限怎么办 手机卡太久没用被注销了怎么办 电信宽带欠费缴费后上不了网怎么办