美文网首页转载上海快风信息科技有限公司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