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上 。因為沒有動畫過程 ,所以肉眼并不會看出來。