实现无限循环ScrollView效果,对于一些人来说,确实有点头痛。最近我也碰到了这类问题,在网上查了好多资料,也烦了好久。虽然网上有详解,不过讲解的过于简单;有demo,但功能也没有达到我的需求。因此,我在前人的基础上,自己写了一个demo,拿出与大家分享,希望能帮到大家。
在设置滑动区域大小时,只设置容纳3个图片视图的大小。滑动时,根据滑动的偏移量进行切换视图的显示。每次滑动停止时,显示的总是中间视图的区域,即中间视图总是展现要显示的图片,左边显示的总是上一张,右边的总是显示下一张,根据一些算法,来处理一些图片加载和滑动时偏移量设置的逻辑。
-(void)loadImage {
//_currentNumber为中间图片数组的下标
_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]];
}
//pragma mark - 滑动视图的代理方法
-(void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView{
//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);
}
#pragma mark - pagecontrol监听方法的实现
- (void)turnPage{
NSInteger page = _pageControl.currentPage;
_currentNumber = page;
[self loadImage];
_scrollView.contentOffset = CGPointMake(_scrollView.bounds.size.width, 0);
}
#pragma mark - 定时器的监听方法
- (void)runTime{
NSInteger page = _pageControl.currentPage;
page ++;
page = page > _imageNames.count-1 ? 0 : page ;
_pageControl.currentPage = page;
[self turnPage];
}
具体参见完整代码