IOS之UIScrollView分页无限循环滚动框架
1原理
先定义3个imageView分别为中间图片视图 midView丶左边图片视图leftView丶右边图片视图rightView,将要展现出来的图片放到一个imageNames数组中,定义_currentNumber来确定分页控件的页号。
将imageView的第currentNumber张图片传给midView,
imageView的第(_currentNumber-1+_imageNames.count) % _imageNames.count张图片传给rightView ,
imageView的第(_currentNumber+1+_imageNames.count) % _imageNames.count张图片传给leftView .
如果滑动视图向右滑时:
_currentNumber = (_currentNumber - 1 + _imageNames.count) % _imageNames.count;
如果向左滑动时:
_currentNumber = (_currentNumber + 1 + _imageNames.count) % _imageNames.count;
2.UIView中的代码
#import "MyScrollView.h"
@interface MyScrollView ()<UIScrollViewDelegate>
@property(nonatomic,strong)UIScrollView *scrollView;
@property(nonatomic, strong)UIPageControl *pageControl;
@property(nonatomic, strong)UIImageView *leftImageView;
@property(nonatomic, strong)UIImageView *middleImageView;
@property(nonatomic, strong)UIImageView *rightImageView;
@property(nonatomic, assign)NSInteger currentNumber;
@property(weak,nonatomic)NSTimer * timer;
@end
@implementation MyScrollView
-(instancetype)initWithFrame:(CGRect)frame {
if (self = [super initWithFrame:frame]) {
}
return self;
}
-(void)setImageNames:(NSArray *)imageNames {
_imageNames = imageNames;
//创建子控件
[self creatSubViews];
[self startTimer];
}
#pragma mark - 1.创建子视图
-(void)creatSubViews {
CGFloat width = self.frame.size.width;
CGFloat height = self.frame.size.height;
_scrollView = [[UIScrollView alloc] initWithFrame:self.bounds];
_scrollView.delegate = self;
_scrollView.pagingEnabled = YES;
_scrollView.showsHorizontalScrollIndicator = NO;
_scrollView.showsVerticalScrollIndicator = NO;
_scrollView.contentSize = CGSizeMake(width * 3, height);
[self addSubview:_scrollView];
//创建分页控件
_pageControl = [[UIPageControl alloc] initWithFrame:CGRectMake(0, self.frame.size.height - 30, width, 30)];
_pageControl.numberOfPages = _imageNames.count;
_pageControl.currentPage = 0;
_pageControl.pageIndicatorTintColor = [UIColor orangeColor];
_pageControl.currentPageIndicatorTintColor = [UIColor greenColor];
[self addSubview:_pageControl];
//3.创建左中右三个图片视图
_leftImageView = [[UIImageView alloc] initWithFrame:CGRectMake(0, 0, width, height)];
_middleImageView = [[UIImageView alloc] initWithFrame:CGRectMake(width, 0, width, height)];
_rightImageView = [[UIImageView alloc] initWithFrame:CGRectMake(width *2 , 0, width, height)];
[_scrollView addSubview:_leftImageView];
[_scrollView addSubview:_middleImageView];
[_scrollView addSubview:_rightImageView];
[self loadImage];
}
-(void)loadImage {
_middleImageView.image = [UIImage imageNamed:_imageNames[_currentNumber]];
NSInteger leftIndex = (_currentNumber - 1 + _imageNames.count) % _imageNames.count;
_leftImageView.image = [UIImage imageNamed:_imageNames[leftIndex]];
NSInteger rightIndex = (_currentNumber + 1) % _imageNames.count;
_rightImageView.image = [UIImage imageNamed:_imageNames[rightIndex]];
}
-(void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView{
NSLog(@"%f",scrollView.contentOffset.x);
//1.判断滑动方向
if (scrollView.contentOffset.x > scrollView.bounds.size.width) {//向左滑动
_currentNumber = (_currentNumber + 1) % _imageNames.count;
}else if(scrollView.contentOffset.x < scrollView.bounds.size.width){ //向右滑动
_currentNumber = (_currentNumber - 1 + _imageNames.count) % _imageNames.count;
}
[self loadImage];
_pageControl.currentPage = _currentNumber;
scrollView.contentOffset = CGPointMake(_scrollView.bounds.size.width, 0);
}
-(void)scrollViewWillBeginDragging:(UIScrollView *)scrollView
{
[self stopTimer];
}
-(void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate
{
[self startTimer];
}
#pragma mark -- 定时器
-(void)startTimer
{
NSTimer * timer = [NSTimer timerWithTimeInterval:2 target:self selector:@selector(next) userInfo:nil repeats:YES];
[[NSRunLoop mainRunLoop]addTimer:timer forMode:NSRunLoopCommonModes];
self.timer = timer;
}
-(void)stopTimer
{
[self.timer invalidate];
self.timer = nil;
}
-(void)next
{
_currentNumber = (_currentNumber + 1) % _imageNames.count;
[self loadImage];
_pageControl.currentPage = _currentNumber;
self.scrollView.contentOffset = CGPointMake(_scrollView.bounds.size.width, 0);
}
@end