#UIScrollView自动无限循环滑动git
##一、UIScrollView概念github
UIScrollView是滚动的view,UIView自己不能滚动,子类UIScrollview拓展了滚动方面的功能。动画
UIScrollView是全部滚动视图的基类。之后的UITableView,UITextView等视图都是继承于该类。atom
使用场景:显示不下(单张大图);内容太多(图文混排);滚动头条(图片);相册等code
无限循环滚动有两个方法,一个是根据图片的数量先后+1,另外一个是3个视图显示,当图片数量不少时,用第一种方法须要建立不少个视图,要占用很大内存,这时就须要第二种方法了,下面就介绍一下第二种方法的实现
ps :用CATransition(转场动画)也能够实现一个视图无限循环切换图片 代码示例:继承
#import "ViewController.h" #define Width [UIScreen mainScreen].bounds.size.width #define Height [UIScreen mainScreen].bounds.size.height @interface ViewController ()<UIScrollViewDelegate> @property (strong, nonatomic) NSArray *imageData; @property (strong, nonatomic) UIScrollView *scrollView; @property (strong, nonatomic) UIImageView *leftImageView; @property (strong, nonatomic) UIImageView *centerImageView; @property (strong, nonatomic) UIImageView *rightImageView; @property (assign, nonatomic) NSInteger centerImageIndex; @property (strong, nonatomic) UIPageControl *pageControl; @end @implementation ViewController - (void)viewDidLoad { [super viewDidLoad]; [self loadImageData]; [self.view addSubview:self.scrollView]; [self.view addSubview:self.pageControl]; [self loadImageView]; } #pragma mark - 建立视图并定义初始图片 - (void)loadImageView { self.leftImageView = [[UIImageView alloc]initWithFrame:CGRectMake(0, 0, Width, Height)]; self.leftImageView.image = [UIImage imageNamed:self.imageData[self.imageData.count-1]]; self.centerImageView = [[UIImageView alloc]initWithFrame:CGRectMake(Width, 0, Width, Height)]; self.centerImageView.image = [UIImage imageNamed:self.imageData[0]]; self.rightImageView = [[UIImageView alloc]initWithFrame:CGRectMake(Width*2, 0, Width, Height)]; self.rightImageView.image = [UIImage imageNamed:self.imageData[1]]; [self.scrollView addSubview:self.leftImageView]; [self.scrollView addSubview:self.centerImageView]; [self.scrollView addSubview:self.rightImageView]; self.centerImageIndex = 0; [self.scrollView setContentOffset:CGPointMake(Width, 0) animated:NO]; } - (void)loadImageData { // 获取文件的本地路径 NSString *plistPath = [[NSBundle mainBundle] pathForResource:@"imageData" ofType:@"plist"]; // 将路径转为对应的数据类型(NSArray) self.imageData = [NSArray arrayWithContentsOfFile:plistPath]; } #pragma mark - 偏移后从新加载图片 - (void)loadImage { NSInteger leftImageIndex,rightImageIndex; CGPoint offset = [self.scrollView contentOffset]; if (offset.x > Width) { //向右偏移 用%能够到图片末尾自动切换到开始 self.centerImageIndex = (self.centerImageIndex + 1) % self.imageData.count; } if (offset.x < Width) { //向左偏移 self.centerImageIndex = (self.centerImageIndex +self.imageData.count - 1) % self.imageData.count; } self.centerImageView.image = [UIImage imageNamed:self.imageData[self.centerImageIndex]]; leftImageIndex = (self.centerImageIndex +self.imageData.count - 1) % self.imageData.count; rightImageIndex = (self.centerImageIndex +1) % self.imageData.count; self.leftImageView.image = [UIImage imageNamed:self.imageData[leftImageIndex]]; self.rightImageView.image = [UIImage imageNamed:self.imageData[rightImageIndex]]; } #pragma mark - 中止滚动时 - (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView { [self loadImage]; [self.scrollView setContentOffset:CGPointMake(Width, 0) animated:NO]; self.pageControl.currentPage = self.centerImageIndex; } #pragma mark - 懒加载视图 - (UIPageControl *)pageControl { if (!_pageControl) { _pageControl = [[UIPageControl alloc]initWithFrame:CGRectMake(0, Height - 30, Width, 2)]; _pageControl.numberOfPages = self.imageData.count; _pageControl.pageIndicatorTintColor = [UIColor orangeColor]; _pageControl.currentPageIndicatorTintColor = [UIColor whiteColor]; } return _pageControl; } - (UIScrollView *)scrollView { if (!_scrollView) { _scrollView = [[UIScrollView alloc]initWithFrame:CGRectMake(0, 0,Width, Height)]; _scrollView.contentSize = CGSizeMake(Width*3, Height); _scrollView.pagingEnabled = YES; _scrollView.bounces = NO; _scrollView.showsHorizontalScrollIndicator = NO; _scrollView.showsVerticalScrollIndicator = NO; _scrollView.delegate = self; } return _scrollView; } - (NSArray *)imageData { if (!_imageData) { _imageData = [NSArray array]; } return _imageData; } @end
实现效果:图片
Demo地址:内存