美文网首页转载上海快风信息科技有限公司iOS学习
三十行核心代码封装自己的轮播图

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

作者: ZhengYaWei | 来源:发表于2017-02-03 15:07 被阅读335次

实际开发中我们可以使用第三方实现无限轮播头,但是一般都会有很多冗余的代码。有时轮播图中还可能对样式要其他要求,索性步入封装一个自己的无限轮播图。下面介绍一下基于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;
}

相关文章

网友评论

  • ngmg:简介明了
  • c44c0bf3f747:很简便😀
  • chenzhy:- (NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section{
    /*********无限轮播关键点1****************/
    return self.cycleModels.count * 10000;
    }
    这个关键点这样设置可以吗,会不会不太合理,万一用户就滑几万下,到最后面就会出现滑不动的情况
    ZhengYaWei:一般开发绝对足够用,没用那个用户会闲的如此无聊的。
  • 知晓程序:你好!我们是爱范儿旗下专注于小程序生态的公众号知晓程序(微信号 zxcx0101)。我们很赞赏你的文章,希望能获得转载授权。授权后,你的文章将会在知晓程序社区(minapp.com)、爱范儿、AppSo 等渠道发布,我们会注明来源和作者姓名。

    非常感谢~~~

本文标题:三十行核心代码封装自己的轮播图

本文链接:https://www.haomeiwen.com/subject/vgrdittx.html