图片无限滚动原理:
在可见的窗口外左右各创建一个复用的imageView。
假设每个imageView宽度是width1,每当滚屏的偏移量>=width1 或者 <=0时,刷新所有的imageView即可。
几个处理的关键点是:
1、滚屏的处理
//滚屏滚动时的代理
-(void)scrollViewDidScroll:(UIScrollView *)scrollView
{
}
//滚屏开始拖拽时的代理,在这里面需要停止定时器
-(void)scrollViewWillBeginDragging:(UIScrollView *)scrollView
{
}
//滚屏停止拖拽时的代理,在这里需要开始定时器
-(void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate
{
}
//与上一个方法类似,也要开始定时器。这两个方法区别是 :上边一个方法如果我手指离开滚屏,同时滚屏也停止滑动了,就会执行上边的方法
-(void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView
{
}
2、滚屏上imageView的数据源处理
//处理滚屏上的imageView ,dir:0:左或下,1:右或上
-(void)dealWithCurrentImageViewWithDirection:(BOOL)dir
{
if(!_isOneScrDealFinish) return;
NSString *needInsertStr = nil;
NSInteger index = 0;
NSArray *currentArr = self.imageArr.count?self.imageArr:self.gropuUrlArr;
if(dir){//向右、下滑
[self.currentImageArr removeLastObject];
NSString *firstStr = self.currentImageArr.firstObject;
index = [currentArr indexOfObject:firstStr];
if(index==0){
needInsertStr = currentArr.lastObject;
}
else
needInsertStr = currentArr[index-1];
[self.currentImageArr insertObject:needInsertStr atIndex:0];
//设置pageControll
if(_pageControl.hidden == NO){
NSInteger curIndex = _pageControl.currentPage - 1;
if(curIndex < 0)
_pageControl.currentPage = _pageControl.numberOfPages-1;
else
_pageControl.currentPage = curIndex;
}
}
else{//左、上滑
[self.currentImageArr removeObjectAtIndex:0];
NSString *lastStr = self.currentImageArr.lastObject;
index = [currentArr indexOfObject:lastStr];
if(index == currentArr.count-1){
needInsertStr = currentArr.firstObject;
}
else
needInsertStr = currentArr[index+1];
[self.currentImageArr addObject:needInsertStr];
//设置pageControll
if(_pageControl.hidden == NO){
NSInteger curIndex = _pageControl.currentPage + 1;
if(curIndex > _pageControl.numberOfPages-1)
_pageControl.currentPage = 0;
else
_pageControl.currentPage = curIndex;
}
}
BOOL isUrl = (self.imageArr.count == 0);
for(NSInteger i=0;i<self.currentImageArr.count;i++){
UIImageView *imageView = self.contentImageViewArr[i];
NSString *str = self.currentImageArr[i];
if(isUrl){
[imageView sd_setImageWithURL:[NSURL URLWithString:str] placeholderImage:[UIImage imageNamed:_defaultImageStr]];
}
else{
imageView.image = [UIImage imageNamed:str];
}
}
//将scrollView归位
if(_scrDirection == scr_horizonDirection)
self.mainScr.contentOffset = CGPointMake(_avgWidth, 0);
else
self.mainScr.contentOffset = CGPointMake(0, _avgHeight);
_isOneScrDealFinish = 1;
}
github下载地址:https://github.com/JbWang-CN/scrollView.git