iOS实现轮播图banner示例
程序员文章站
2023-12-21 09:30:34
楼主项目中需要有一个轮播图,因为比较简单,就自己写了个,因为是从网上弄得图片 所以用了sdwebimage 这个三方库 当然自己也可以去掉
类型后面有*号 如用使用 请自...
楼主项目中需要有一个轮播图,因为比较简单,就自己写了个,因为是从网上弄得图片 所以用了sdwebimage 这个三方库 当然自己也可以去掉
类型后面有*号 如用使用 请自行加上。。。。。
代码:.h 文件
@protocol tjxviewdelegate<nsobject> //判断点击的那个 -(void)sendimagename:(tjxview *)tjxview andname:(nsinteger)selectimage; @end @interface tjxview : uiview @property (nonatomic,weak)id<tjxviewdelegate>delegate; //传一个frame 和 装有图片名字的数组过来 //参数一:frame //参数二:装有图片名字的数组 //参数三:bool如果是yes,那么自动滚动,如果是no不滚动 -(id)initwithframe:(cgrect)frame andimagenamearray: (nsmutablearray * )imagenamearray andisrunning:(bool)isrunning; @end
.m文件
@interface tjxview()<uiscrollviewdelegate> { nsinteger _currentpage; //记录真实的页码数 nstimer *_timer; //生命一个全局变量 } @property (nonatomic,assign) bool isrun; @property (nonatomic,strong) nsmutablearray *imagearray;//存储图片的名字 @property (nonatomic,strong) uiscrollview *scrollview; @property (nonatomic,strong) uipagecontrol *pagecontrol; @property (nonatomic,assign) cgfloat width;//view的宽 @property (nonatomic,assign) cgfloat height;//view的高 @end -(id)initwithframe:(cgrect)frame andimagenamearray:(nsmutablearray *)imagenamearray andisrunning:(bool)isrunning{ self = [super initwithframe:frame]; if (self) { _width = self.frame.size.width; _height = self.frame.size.height; //arraywitharray 把数组中的内容放到一个数组中返回 self.imagearray = [nsmutablearray arraywitharray:imagenamearray]; //在数组的尾部添加原数组第一个元素 [self.imagearray addobject:[imagenamearray firstobject]]; //在数组的首部添加原数组最后一个元素 [self.imagearray insertobject:[imagenamearray lastobject] atindex:0]; self.isrun = isrunning; _currentpage = 0; [self createsro]; [self createpagecontrol]; [self createtimer]; } return self; } -(void)createtimer{ if (_isrun == yes) { _timer = [nstimer scheduledtimerwithtimeinterval:2 target:self selector:@selector(change) userinfo:nil repeats:yes ]; [[nsrunloop currentrunloop]addtimer:_timer formode:nsrunloopcommonmodes]; } } -(void)change{ //1获得当前的点 cgpoint point = _scrollview.contentoffset; //2求得将要变换的点 cgpoint endpoint = cgpointmake(point.x+_width, 0); //判断 if (endpoint.x == (self.imagearray.count-1)*_width) { [uiview animatewithduration:0.25 animations:^{ _scrollview.contentoffset = cgpointmake(endpoint.x, 0); } completion:^(bool finished) { //动画完成的block _scrollview.contentoffset = cgpointmake(_width, 0); cgpoint realend = _scrollview.contentoffset; //取一遍页码数 _currentpage = realend.x/_width; _pagecontrol.currentpage = _currentpage-1; }]; } else{ //0.25s中更改一个图片 [uiview animatewithduration:0.25 animations:^{ _scrollview.contentoffset = endpoint; } completion:^(bool finished) { }]; cgpoint realend = _scrollview.contentoffset; //取一遍页码数 _currentpage = realend.x/_width; _pagecontrol.currentpage = _currentpage-1; } } //创建页码指示器 -(void)createpagecontrol{ _pagecontrol = [[uipagecontrol alloc]initwithframe:cgrectmake(_width-200, _height-30, 100, 30)]; _pagecontrol.centerx = _width/2; _pagecontrol.numberofpages = self.imagearray.count-2; _pagecontrol.pageindicatortintcolor = wp_gray_color; _pagecontrol.currentpageindicatortintcolor = [uicolor whitecolor]; _pagecontrol.userinteractionenabled = no; [self addsubview:_pagecontrol]; } //创建滚动视图 -(void)createsro{ _scrollview = [[uiscrollview alloc]initwithframe:cgrectmake(0, 0, _width, _height)]; _scrollview.contentsize = cgsizemake(_width*self.imagearray.count, _height); for (int i = 0; i < self.imagearray.count; i++) { uiimageview *imageview = [[uiimageview alloc]initwithframe:cgrectmake(i*_width, 0, _width, _height)]; // imageview.image = [uiimage imagenamed:self.imagearray[i]]; [imageview sd_setimagewithurl:self.imagearray[i] placeholderimage:[uiimage imagenamed:@"home_banner_blank"]]; imageview.userinteractionenabled = yes; imageview.tag = 200+i; uitapgesturerecognizer *tap = [[uitapgesturerecognizer alloc]initwithtarget:self action:@selector(tap:)]; [imageview addgesturerecognizer:tap]; [_scrollview addsubview:imageview]; } //水平指示条不显示 _scrollview.showshorizontalscrollindicator = no; //关闭弹簧效果 _scrollview.bounces = no; //设置用户看到第一张 _scrollview.contentoffset = cgpointmake(_width, 0); //设置代理 _scrollview.delegate = self; //分页效果 _scrollview.pagingenabled = yes; [self addsubview:_scrollview]; } -(void)tap:(uitapgesturerecognizer *)tap{ if(_delegate&&[_delegate respondstoselector:@selector(sendimagename:andname:)]){ [_delegate sendimagename:self andname:tap.view.tag-201]; }else{ nslog(@"没有设置代理或者没有事先协议的方法"); } } #pragma mark uiscrollviewdelegate //停止滚动 -(void)scrollviewdidenddecelerating:(uiscrollview *)scrollview{ if (_timer) { [_timer setfiredate:[nsdate datewithtimeintervalsincenow:2]]; } //图片的个数 1 2 3 4 5 6 7 8 //真实的页码 0 1 2 3 4 5 6 7 //显示的页码 0 1 2 3 4 5 cgpoint point = _scrollview.contentoffset; if (point.x == (self.imagearray.count-1)*_width) { scrollview.contentoffset = cgpointmake(_width, 0); } if (point.x == 0) { scrollview.contentoffset = cgpointmake((self.imagearray.count-2)*_width, 0); } //取一遍页码数 cgpoint endpoint = scrollview.contentoffset; _currentpage = endpoint.x/_width; _pagecontrol.currentpage = _currentpage-1; } //手指开始触摸的时候,停止计时器 -(void)scrollviewwillbegindragging:(uiscrollview *)scrollview{ if (_timer) { //如果有,停掉 [_timer setfiredate:[nsdate distantfuture]]; } }
在项目中 导入头文件 遵守代理
tjxview * tjxview = [[tjxview alloc]initwithframe:cgrectmake(0, 0, wpscreen_width, 100*wpscreen_higth_ratio) andimagenamearray:self.bannerimager andisrunning:yes]; tjxview.delegate = self; [self.view addsubview: tjxview]; #pragma mark tjxviewdelegate -(void)sendimagename:(tjxview *) tjxview andname:(nsinteger)selectimage{ kklog(@"%ld",(long)selectimage); }
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。