实际开发中我们可以使用第三方实现无限轮播头,但是一般都会有很多冗余的代码。有时轮播图中还可能对样式要其他要求,索性步入封装一个自己的无限轮播图。下面介绍一下基于UICollectionView封装的一个实用的轮播图。源代码链接:https://github.com/ZhengYaWei1992/ZWCycleView
效果图直接看如下的三十行核心代码即可。cycleModels中放置的是轮播图相关的图像和文字信息。这里要注意在collectionView开始拖动的时候,销毁定时器,在结束拖动的时候要创建定时器。不能通过[NSDate distantFuture]和[NSDate distancePast]控制定时器的开关,应该是销毁和创建,否则会有Bug。
- (NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section{
/*********无限轮播关键点1****************/
return self.cycleModels.count * 10000;
}
- (UICollectionViewCell*)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath{
ZWCycleCollectionCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:@"ZWCycleCollectionCell" forIndexPath:indexPath];
/*********无限轮播关键点2****************/
//实际使用的时候用SDWebImage设置一下就可以
cell.myImageView.image = [UIImage imageNamed:self.cycleModels[indexPath.row % self.cycleModels.count].imageUrl];
cell.label.text =self.cycleModels[indexPath.row % self.cycleModels.count].des;
return cell;
}
- (void)scrollViewDidScroll:(UIScrollView *)scrollView{
// 1.获取滚动的偏移量
CGFloat offsetX = scrollView.contentOffset.x + scrollView.frame.size.width * 0.5;
// 2.计算pageControl的currentIndex
/*********无限轮播关键点3****************/
self.pageControl.currentPage = (int)(offsetX/scrollView.frame.size.width) % (_cycleModels.count);
}
//开始拖动的时候销毁定时器,结束拖动时开启定时器。使用[NSDate distantFuture]和[NSDate distancePast]会有Bug
- (void)scrollViewWillBeginDragging:(UIScrollView *)scrollView{
[self removeTimer];
}
-(void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate{
[self addTimer];
}
- (void)onTimer:(NSTimer *)timer{
// 1.获取滚动的偏移量
CGFloat currentOffsetX = self.collectionView.contentOffset.x;
CGFloat offsetX = currentOffsetX + self.collectionView.frame.size.width;
// 2.滚动该位置
[self.collectionView setContentOffset:CGPointMake(offsetX, 0) animated:YES];
}
-(void)addTimer{
_timer = [NSTimer scheduledTimerWithTimeInterval:3.0 target:self selector:@selector(onTimer:) userInfo:nil repeats:YES];
[[NSRunLoop mainRunLoop]addTimer:_timer forMode:NSRunLoopCommonModes];
}
- (void)removeTimer{
[_timer invalidate];
_timer = nil;
}
网友评论
/*********无限轮播关键点1****************/
return self.cycleModels.count * 10000;
}
这个关键点这样设置可以吗,会不会不太合理,万一用户就滑几万下,到最后面就会出现滑不动的情况
非常感谢~~~