三十行核心代码封装自己的轮播图

实际开发中我们可以使用第三方实现无限轮播头,但是一般都会有很多冗余的代码。有时轮播图中还可能对样式要其他要求,索性步入封装一个自己的无限轮播图。下面介绍一下基于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;
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 174,362评论 25 709
  • 发现 关注 消息 iOS 第三方库、插件、知名博客总结 作者大灰狼的小绵羊哥哥关注 2017.06.26 09:4...
    肇东周阅读 12,283评论 4 61
  • 步入30了,身边有好多让我帮忙介绍对象的同龄人,有的甚至比我大很多。一问他们有什么要求,他们的回答就是没有要求啊。...
    一诺花开阅读 676评论 7 2
  • 不是每个恋曲都有美好回忆。 突然想起这句歌词,然后去搜了这首歌来听,原来这首歌是林志颖唱的。点击歌名,开始播放,才...
    兰思阅读 814评论 0 1
  • 感恩今日早起站桩,为了健康的作息习惯,为了像海绵一样挤出时间,明日继续,哈哈哈哈哈哈哈哈~ 感恩早起给家人做饭炒菜...
    黎家小蔓阅读 249评论 0 0