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上 。因为没有动画过程 ,所以肉眼并不会看出来。