无限循环ScrollView

陈志
2023-12-01

无限循环ScrollView(方法一)

实现无限循环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];
}

具体参见完整代码

 类似资料: