当前位置: 移动技术网 > 移动技术>移动开发>IOS > Objective-C实现无限循环轮播器

Objective-C实现无限循环轮播器

2019年07月24日  | 移动技术网移动技术  | 我要评论

先看看效果图:

具体实现代码:

1. 控制器    

//
// appdelegate.m
// 无限轮播器
//
// created by zhangmi on 16/5/16.
// copyright © 2016年 paramount pictures. all rights reserved.
//
#import "viewcontroller.h"
#import "sninfinitescrollview.h"
 
@interface viewcontroller ()
 
@end
 
@implementation viewcontroller
 
- (void)viewdidload {
 [super viewdidload];
 // do any additional setup after loading the view, typically from a nib.
  
 nsmutablearray * images = [nsmutablearray array];
 for (int i = 0; i < 5; i++) {
  nsstring * imagename = [nsstring stringwithformat:@"ad_%02d", i]; //img01
  uiimage * image = [uiimage imagenamed:imagename];
  [images addobject:image];
 }
 uiview * scrollview = [sninfinitescrollview scrollviewwithframe:cgrectmake(0, 20, 414, 200) superview:self.view images:images scrolldirection:scrolldirectionhorizontal pageindicatortintcolor:[uicolor lightgraycolor] currentpageindicatortintcolor:[uicolor orangecolor] imageviewcontentmode:uiviewcontentmodescaleaspectfit];
  
 [self.view addsubview:scrollview];
}
 
@end

2. 显示内容界面设置

//
// appdelegate.m
// 无限轮播器
//
// created by zhangmi on 16/5/16.
// copyright © 2016年 paramount pictures. all rights reserved.
//
 
#import "sninfinitescrollview.h"
 
static int const imageviewcount = 3;
#define scrollviewwidth self.scrollview.frame.size.width
#define scrollviewheight self.scrollview.frame.size.height
 
@interface sninfinitescrollview () <uiscrollviewdelegate>
 
@property(weak, nonatomic) uiscrollview * scrollview;
@property(weak, nonatomic) nstimer * timer;
/** pageindex */
@property(nonatomic, assign) nsinteger pageindex;
 
@end
 
@implementation sninfinitescrollview
 
- (void)setimages:(nsarray<uiimage *> *)images {
  
 _images = images;
  
 // 设置页码
 self.pageindex = 0;
  
 // 设置内容
 [self updatecontent];
  
 // 开始定时器
 [self starttimer];
}
 
/** 代码创建的时候调用. */
- (instancetype)initwithframe:(cgrect)frame {
 if (self = [super initwithframe:frame]) {
  // 滚动视图
  uiscrollview * scrollview = [[uiscrollview alloc] init];
   
  self.scrollview = scrollview;
  scrollview.delegate = self;
  // scroller属性
  scrollview.showshorizontalscrollindicator = no;
  scrollview.showsverticalscrollindicator = no;
  scrollview.pagingenabled = yes;
  scrollview.bounces = no;
  // 添加scrollview
  [self addsubview:scrollview];
   
  // 图片控件
  for (int i = 0; i < imageviewcount; i++) {
   uiimageview * imageview = [[uiimageview alloc] init];
   // 图片不变形处理.
   imageview.contentmode = self.imageviewcontentmode;
   [scrollview addsubview:imageview];
  }
 }
 return self;
}
/** 布局 子控件, 只执行一次 */
- (void)layoutsubviews {
 [super layoutsubviews];
  
 self.scrollview.frame = self.bounds;
 if (self.scrolldirection == scrolldirectionvertical) {
  self.scrollview.contentsize = cgsizemake(0, imageviewcount * self.bounds.size.height);
 } else {
  self.scrollview.contentsize = cgsizemake(imageviewcount * self.bounds.size.width, 0);
 }
  
 for (int i = 0; i < imageviewcount; i++) {
  uiimageview * imageview = self.scrollview.subviews[i];
   
  if (self.scrolldirection == scrolldirectionvertical) {
   imageview.frame = cgrectmake(0, i * self.scrollview.frame.size.height, self.scrollview.frame.size.width, self.scrollview.frame.size.height);
  } else {
   imageview.frame = cgrectmake(i * self.scrollview.frame.size.width, 0, self.scrollview.frame.size.width, self.scrollview.frame.size.height);
  }
 }
 // 设置内容
 [self updatecontent];
}
#pragma mark - 内容更新
- (void)updatecontent {
 // 设置图片
 for (int i = 0; i < self.scrollview.subviews.count; i++) {
   
  nsinteger pageindex = self.pageindex;
  // 遍历每一个imageview
  uiimageview * imageview = self.scrollview.subviews[i];
   
  if (i == 0) {
   pageindex--;
  } else if (i == 2) {
   pageindex++;
  }
   
  if (pageindex < 0) {
   pageindex = self.images.count - 1;
  } else if (pageindex >= self.images.count) {
   pageindex = 0;
  }
  // 图片角标 赋值给 imageview的tag
  imageview.tag = pageindex;
  imageview.image = self.images[imageview.tag];
 }
  
 // 设置偏移量在中间 // 不能使用带动画 contentoffset
 if (self.scrolldirection == scrolldirectionvertical) {
  self.scrollview.contentoffset = cgpointmake(0, scrollviewheight);
 } else {
  self.scrollview.contentoffset = cgpointmake(scrollviewwidth, 0);
 }
}
#pragma mark - <uiscrollviewdelegate>
- (void)scrollviewdidscroll:(uiscrollview *)scrollview {
 // 找出最中间的那个图片控件
 nsinteger page = self.pageindex;
 cgpoint point = cgpointzero;
 for (int i = 0; i < self.scrollview.subviews.count; i++) {
  uiimageview * imageview = self.scrollview.subviews[i];
  point = [scrollview convertpoint:imageview.frame.origin toview:self.superview];
  //=****** other way ****************** stone ***
  if (self.scrolldirection == scrolldirectionvertical) {
   if (abs(point.y - self.frame.origin.y) < 1.0) {
    page = imageview.tag;
   }
  } else {
   if (abs(point.x - self.frame.origin.x) < 1.0) {
    page = imageview.tag;
   }
  }
 }
 self.pageindex = page;
 self.pagecontrol.currentpage = page;
  
 //拖动结束会调用 [self updatecontent];
 //#warning mark - 没有动画正常 , 有动画不动, 一直是原点
 // [self updatecontent]; // 没有动画正常 , 有动画不动, 一直是原点
}
/** 开始拖拽 */
- (void)scrollviewwillbegindragging:(uiscrollview *)scrollview {
 // 停止定时器
 [self stoptimer];
}
/** 结束拖拽 */
- (void)scrollviewdidenddragging:(uiscrollview *)scrollview willdecelerate:(bool)decelerate {
 // 开启定时器
 [self starttimer];
}
/** 减速完毕 */
- (void)scrollviewdidenddecelerating:(uiscrollview *)scrollview {
 // 更新内容 , 如果contentoffset 不带动画的话 不走这个方法
 [self updatecontent];
}
/** 结束滚动动画 */ // 这是保险的做法吧... 如果contentoffset 不带动画的话 不走这个方法
- (void)scrollviewdidendscrollinganimation:(uiscrollview *)scrollview {
 // 更新内容
 [self updatecontent];
}
 
#pragma mark - 定时器处理
- (void)starttimer {
  
 nstimer * timer = [nstimer scheduledtimerwithtimeinterval:1.0 target:self selector:@selector(next:) userinfo:nil repeats:yes];
 // [[nsrunloop mainrunloop] addtimer:timer formode:nsrunloopcommonmodes];
 [[nsrunloop currentrunloop] addtimer:timer formode:nsrunloopcommonmodes];
 self.timer = timer;
}
 
- (void)stoptimer {
 [self.timer invalidate];
 self.timer = nil;
}
 
- (void)next:(nstimer *)timer {
 if (self.scrolldirection == scrolldirectionvertical) {
  [self.scrollview setcontentoffset:cgpointmake(0, 2 * self.scrollview.frame.size.height) animated:yes];
 } else {
  [self.scrollview setcontentoffset:cgpointmake(2 * self.scrollview.frame.size.width, 0) animated:yes];
 }
}
//=****** 简单调用 ****************** stone ***
+ (instancetype)scrollviewwithframe:(cgrect)frame superview:(uiview *)superview images:(nsarray<uiimage *> *)images scrolldirection:(scrolldirection)scrolldirection pageindicatortintcolor:(uicolor *)pageindicatortintcolor currentpageindicatortintcolor:(uicolor *)currentpageindicatortintcolor imageviewcontentmode:(uiviewcontentmode)imageviewcontentmode {
  
 //=****** 添加自定义scrollview ****************** stone ***
 sninfinitescrollview * scrollview = [[sninfinitescrollview alloc] init];
 scrollview.frame = frame;
 scrollview.imageviewcontentmode = imageviewcontentmode;
 scrollview.scrolldirection = scrolldirection;
 //=****** 添加image ****************** stone ***
 scrollview.images = images;
 //=****** 添加pagecontrol ****************** stone ***
 uipagecontrol * pagecontrol = [[uipagecontrol alloc] init];
 scrollview.pagecontrol = pagecontrol;
 pagecontrol.enabled = no;
 pagecontrol.currentpageindicatortintcolor = currentpageindicatortintcolor;
 pagecontrol.pageindicatortintcolor = pageindicatortintcolor;
 pagecontrol.numberofpages = scrollview.images.count;
 pagecontrol.bounds = cgrectmake(0, 0, scrollview.bounds.size.width, 44);
 pagecontrol.center = cgpointmake(scrollview.bounds.size.width * 0.5, scrollview.bounds.size.height * 0.9);
 [scrollview addsubview:pagecontrol];
 [superview addsubview:scrollview];
 //=************************ stone ***
 return scrollview;
}
 
@end

以上就是本文的全部内容,希望对大家的学习有所帮助。

如对本文有疑问, 点击进行留言回复!!

相关文章:

验证码:
移动技术网