ScrollView 实现循环轮播
1 #import "MassageViewController.h" 2 @interface MassageViewController()<UIScrollViewDelegate> 3 @property (nonatomic,strong) UIScrollView *PicScrollView; 4 @property (nonatomic,strong) UIPageControl *PicCtr; 5 @property (nonatomic,strong) NSTimer *timer; 6 @property (nonatomic,strong) NSMutableArray *picArr; 7 @property (nonatomic,strong) UIImageView *PicImageView; 8 @property (nonatomic,strong) UIImageView *lastImageView; 9 @end 10 11 @implementation MassageViewController 12 -(NSMutableArray *)picArr{ 13 if (self.picArr==nil) { 14 _picArr = [NSMutableArray array]; 15 } 16 return _picArr; 17 } 18 19 -(void)viewDidLoad{ 20 self.picArr = [self loadImageData]; 21 self.PicScrollView = [[UIScrollView alloc]initWithFrame:CGRectMake(0, 150, self.view.frame.size.width, 200)]; 22 _PicScrollView.pagingEnabled = YES; 23 _PicScrollView.delegate = self; 24 _PicScrollView.showsHorizontalScrollIndicator = NO; 25 _PicScrollView.tag = 1000; 26 _PicScrollView.contentSize = CGSizeMake(self.PicScrollView.width * (_picArr.count), 0); 27 for (int i =0; i<_picArr.count; i++) { 28 CGFloat imgX = self.view.frame.size.width * i; 29 self.PicImageView = [[UIImageView alloc]initWithFrame:CGRectMake(imgX, 0, self.view.frame.size.width, 200)]; 30 _PicImageView.image = [_picArr objectAtIndex:i]; 31 [_PicScrollView addSubview:_PicImageView]; 32 } 33 CGFloat imgX = CGRectGetWidth(self.view.frame)*_picArr.count; 34 _lastImageView = [[UIImageView alloc]initWithFrame:CGRectMake(imgX, 0, self.view.frame.size.width, 200)]; 35 _lastImageView.image = [_picArr objectAtIndex:0]; 36 [_PicScrollView addSubview:_lastImageView]; 37 38 39 [self.view addSubview:_PicScrollView]; 40 self.PicCtr = [[UIPageControl alloc]initWithFrame:CGRectMake((self.PicScrollView.width-150)/2, self.PicScrollView.y+200-40, 150, 30)]; 41 _PicCtr.pageIndicatorTintColor = [UIColor grayColor]; 42 _PicCtr.currentPageIndicatorTintColor = [UIColor redColor]; 43 _PicCtr.numberOfPages = 5; 44 _PicCtr.currentPage = 0; 45 [self.view addSubview:_PicCtr]; 46 [self.view bringSubviewToFront:_PicCtr]; 47 48 self.timer = [NSTimer scheduledTimerWithTimeInterval:1.0 target:self selector:@selector(scrollImage) userInfo:nil repeats:YES]; 49 //修改优先级与其他控件一样 50 //获取当前消息循环对象 51 NSRunLoop *runLoop = [NSRunLoop currentRunLoop]; 52 //设置优先级 53 [runLoop addTimer:self.timer forMode:NSRunLoopCommonModes]; 54 } 55 56 -(NSMutableArray *)loadImageData{//加载图片 57 NSMutableArray *arr = [NSMutableArray array]; 58 for (int i = 0; i<5; i++) {
//为了节约内存,建议使用路径加载,注意图片不要放在Assets.xcassets里面,否则读取不到 59 NSString *imgName = [NSString stringWithFormat:@"%02d.jpg",i+1];//注意.jpg格式,图片格式统一 60 NSString *imgPath = [[NSBundle mainBundle]pathForResource:imgName ofType:nil]; 61 UIImage *image = [UIImage imageWithContentsOfFile:imgPath]; 62 [arr addObject:image]; 63 } 64 return arr; 65 } 66 67 -(UIStatusBarStyle)preferredStatusBarStyle{ 68 return UIStatusBarStyleLightContent; 69 } 70 71 -(void)scrollViewWillBeginDragging:(UIScrollView *)scrollView{ 72 //停止计时器 73 [self.timer invalidate]; 74 self.timer = nil; 75 } 76 77 -(void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate{ 78 79 //r如果放到didscroll里面,每次自动播放都会调用,我们想要手指拖动时才调用,所以放到这里面,每次拖到第几张,白点就点亮 80 CGFloat offsetX = self.PicScrollView.contentOffset.x + self.PicScrollView.frame.size.width/2; 81 int index = offsetX/self.PicScrollView.width; 82 _PicCtr.currentPage = index; 83 84 //重新启用计时器 85 self.timer = [NSTimer scheduledTimerWithTimeInterval:1.0 target:self selector:@selector(scrollImage) userInfo:nil repeats:YES]; 86 //修改优先级与其他控件一样 87 //获取当前消息循环对象 88 NSRunLoop *runLoop = [NSRunLoop currentRunLoop]; 89 //设置优先级 90 [runLoop addTimer:self.timer forMode:NSRunLoopCommonModes]; 91 } 92 93 -(void)scrollImage{ 94 //在scrollview后面加一个imageview,和第一个图一样。 95 float offsetx = _PicScrollView.contentOffset.x; 96 offsetx += CGRectGetWidth(self.view.frame); 97 if (offsetx == CGRectGetWidth(self.view.frame)*_picArr.count) { 98 _PicCtr.currentPage = 0; 99 }else{ 100 _PicCtr.currentPage = offsetx/CGRectGetWidth(self.view.frame); 101 } 102 if (offsetx>CGRectGetWidth(self.view.frame)*_picArr.count) { 103 //直接复制速度很快直接和lastImageView一样,看起来就是循环播放的 104 _PicScrollView.contentOffset= CGPointMake(0, 0); 105 _PicCtr.currentPage = 1; 106 [_PicScrollView setContentOffset:CGPointMake(CGRectGetWidth(self.view.frame), 0) animated:YES]; 107 }else{ 108 [_PicScrollView setContentOffset:CGPointMake(offsetx, 0) animated:YES]; 109 } 110 } 111 @end