無限輪播圖的原理

UIScrollView的一點總結(jié)

在循環(huán)滾動廣告的設(shè)計中,利用一個定時器定時調(diào)用調(diào)整ScrollView的偏移量 。在動畫過程結(jié)束后的瞬間,改變?nèi)齻€ImageView的的內(nèi)容,因為快速的刷新,所以肉眼觀察不出變化 。

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 數(shù)字記錄三個imageView加載的內(nèi)容數(shù)組中的數(shù)據(jù)索引 。

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 所以要延遲一定的時候后再進行下一步的調(diào)整。

 // 原本是scrollView 的回調(diào)函數(shù),但是,self 也是可以調(diào)用的 ,但是這里的輸入值已經(jīng)不是 scrollView    
 //因為 移動動畫 的時間是 .4f 所以,更新算法,也要延遲 .4f            
[NSTimer scheduledTimerWithTimeInterval:.4f target:self selector:@selector(scrollViewDidEndDecelerating:) userInfo:nil repeats:NO];

#pragma mark - 核心算法 。
#pragma mark - 圖片停止時,調(diào)用該函數(shù)使得滾動視圖復(fù)用
- (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView
{
    
    // 當手動拖動的時候 ,代理才會回調(diào)
    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已經(jīng)退回去了 。
    _adScrollView.contentOffset = CGPointMake(kAdViewWidth, 0);
    
    //手動控制圖片滾動應(yīng)該取消那個三秒的計時器
    if (!_isTimeUp) {
        //如果移動 圖譜片 ,就要把計時器起點復(fù)位 。(因為你不能保證每次都是翻頁,所以只要一動,就要復(fù)位)
        [moveTimer setFireDate:[NSDate dateWithTimeIntervalSinceNow:_adMoveTime]];
    }
    _isTimeUp = NO;
}

最后是核心的算法 ,變化數(shù)據(jù)的索引,加載新的圖片 ,設(shè)置完成后,在瞬間完成scrollView偏移量的回滾 。也就是當前的圖片。又回到的中間的imageView上 。因為沒有動畫過程 ,所以肉眼并不會看出來。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容