无限轮播图的原理

作者: 苏永茂 | 来源:发表于2016-03-14 15:51 被阅读976次

UIScrollView的一点总结

在循环滚动广告的设计中,利用一个定时器定时调用调整ScrollView的偏移量 。在动画过程结束后的瞬间,改变三个ImageView的的内容,因为快速的刷新,所以肉眼观察不出变化 。

leftImageIndex = imageLinkURL.count-1;
    centerImageIndex = 0;
    rightImageIndex = 1;
    if (imageLinkURL.count == 1) {
        _adScrollView.scrollEnabled = NO;
        [_centerImageView sd_setImageWithURL:[NSURL URLWithString:imageLinkURL[centerImageIndex]] placeholderImage:self.placeHoldImage];
    }else{
    [_leftImageView sd_setImageWithURL:[NSURL URLWithString:imageLinkURL[leftImageIndex]] placeholderImage:self.placeHoldImage];
    [_centerImageView sd_setImageWithURL:[NSURL URLWithString:imageLinkURL[centerImageIndex]] placeholderImage:self.placeHoldImage];
    [_rightImageView sd_setImageWithURL:[NSURL URLWithString:imageLinkURL[rightImageIndex]]placeholderImage:self.placeHoldImage];
    }

用三个int 数字记录三个imageView加载的内容数组中的数据索引 。

moveTimer = [NSTimer scheduledTimerWithTimeInterval:_adMoveTime target:self selector:@selector(animalMoveImage:) userInfo:nil repeats:YES];

启动定时器 。准备让scrollView自动滚动。 [_adScrollView setContentOffset:CGPointMake(kAdViewWidth * 2, 0) animated:YES];
让scrollView的偏移量指向第二张图。


这个时候一定要注意:

scrollView偏移的动画是有时间的 .3f~.4f s 所以要延迟一定的时候后再进行下一步的调整。

 // 原本是scrollView 的回调函数,但是,self 也是可以调用的 ,但是这里的输入值已经不是 scrollView    
 //因为 移动动画 的时间是 .4f 所以,更新算法,也要延迟 .4f            
[NSTimer scheduledTimerWithTimeInterval:.4f target:self selector:@selector(scrollViewDidEndDecelerating:) userInfo:nil repeats:NO];

#pragma mark - 核心算法 。
#pragma mark - 图片停止时,调用该函数使得滚动视图复用
- (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView
{
    
    // 当手动拖动的时候 ,代理才会回调
    if (![scrollView isKindOfClass:[UIScrollView class]]) {
        
    }
    
    //第一张
    if (_adScrollView.contentOffset.x == 0)
    {
        centerImageIndex = centerImageIndex - 1;
        leftImageIndex = leftImageIndex - 1;
        rightImageIndex = rightImageIndex - 1;
        
        if (leftImageIndex == -1) {
            leftImageIndex = _imageLinkURL.count-1;
        }
        if (centerImageIndex == -1)
        {
            centerImageIndex = _imageLinkURL.count-1;
        }
        if (rightImageIndex == -1)
        {
            rightImageIndex = _imageLinkURL.count-1;
        }
    }
    //最后一张
    else if(_adScrollView.contentOffset.x == kAdViewWidth * 2)
    {
        centerImageIndex = centerImageIndex + 1;
        leftImageIndex = leftImageIndex + 1;
        rightImageIndex = rightImageIndex + 1;
        
        if (leftImageIndex == _imageLinkURL.count) {
            leftImageIndex = 0;
        }
        if (centerImageIndex == _imageLinkURL.count)
        {
            centerImageIndex = 0;
        }
        if (rightImageIndex == _imageLinkURL.count)
        {
            rightImageIndex = 0;
        }
    }
    else
    {
        return;
    }
    
    [_leftImageView sd_setImageWithURL:[NSURL URLWithString:_imageLinkURL[leftImageIndex]] placeholderImage:self.placeHoldImage];
    
    [_centerImageView sd_setImageWithURL:[NSURL URLWithString:_imageLinkURL[centerImageIndex]] placeholderImage:self.placeHoldImage];
    
    [_rightImageView sd_setImageWithURL:[NSURL URLWithString:_imageLinkURL[rightImageIndex]] placeholderImage:self.placeHoldImage];
    
    _pageControl.currentPage = centerImageIndex;
    
    //有时候只有在右标签的时候才需要加载
    if (_adTitleArray)
    {
        if (centerImageIndex<=_adTitleArray.count-1)
        {
            _centerAdLabel.text = _adTitleArray[centerImageIndex];
        }
    }
    //瞬间改变 scrollView 的偏移量 。因为没有动画 ,刷新快,人的视觉并不会察觉scrollView已经退回去了 。
    _adScrollView.contentOffset = CGPointMake(kAdViewWidth, 0);
    
    //手动控制图片滚动应该取消那个三秒的计时器
    if (!_isTimeUp) {
        //如果移动 图谱片 ,就要把计时器起点复位 。(因为你不能保证每次都是翻页,所以只要一动,就要复位)
        [moveTimer setFireDate:[NSDate dateWithTimeIntervalSinceNow:_adMoveTime]];
    }
    _isTimeUp = NO;
}

最后是核心的算法 ,变化数据的索引,加载新的图片 ,设置完成后,在瞬间完成scrollView偏移量的回滚 。也就是当前的图片。又回到的中间的imageView上 。因为没有动画过程 ,所以肉眼并不会看出来。

相关文章

  • 第五周学习内容

    焦点图轮播特效之原理、焦点图轮播样式之布局、焦点图轮播之箭头切换、焦点图轮播之无限滚动。 js简介、用法、输出。

  • 轮播图:无限轮播(三图轮播原理)

    前言 所谓三图轮播原理:只创建三个imageView,用来显示多于多张图片,其中心思想是每次都让中间的imageV...

  • 无限轮播图的原理

    UIScrollView的一点总结 在循环滚动广告的设计中,利用一个定时器定时调用调整ScrollView的偏移量...

  • [iOS]定制性强的广告轮播图--SCAdView

    @[无限轮播图] @[3D轮播图] @[广告轮播图] SCAdView Statement If my code ...

  • iOS 3D 轮播图,scrollView 自定义分页

    效果图 主要知识点: 无限轮播原理自动轮播 timer 导致页面无法释放问题collectionView 自定义分...

  • 4.6无限轮播

    无限轮播跟左右轮播还是有区别的.无限轮播就是自己无限的轮播下去.不经过人为的触发,不过它的原理还是与左边的距离为参...

  • swift轮播图的实现-UIScrollView

    目标 :UIScrollView+三UIImageView的轮播图实现 原理:利用UIScrollView实现轮播...

  • 有间距的无限轮播图

    最近需求中需要用到中间有间隔的无限轮播图,中间还要放大。所以仿照SDCycleScrollView的原理自己写了一...

  • 无限循环轮播图

    无限循环轮播图 在工作的过程中,很多情况下会遇到要使用轮播图,相信大家也遇到过,使用轮播图的话分两种情况:不能无限...

  • android轮播图效果

    先上效果图: viewpager+handler+runnableTask实现轮播图效果。可以自动轮播,左右无限滑...

网友评论

    本文标题:无限轮播图的原理

    本文链接:https://www.haomeiwen.com/subject/aypflttx.html