转载上海快风信息科技有限公司iOS学习

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

2017-02-03  本文已影响335人  ZhengYaWei

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

猜你喜欢

热点阅读