猫猫学iOS 之广告轮播图,collectionView制作(源码)

Posted 翟乃玉

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了猫猫学iOS 之广告轮播图,collectionView制作(源码)相关的知识,希望对你有一定的参考价值。

猫猫分享,必须精品

原创文章,欢迎转载。转载请注明:翟乃玉的博客
地址:http://blog.csdn.net/u013357243
源码共享:https://github.com/znycat/NYCarouselView

效果图

源代码

NYCarouselView.h

//
//  NYCarouselView.h
//  广告轮播CollectionView
//
//  Created by ios on 15/12/26.
//  Copyright © 2015年 com.itcat.com. All rights reserved.
//

#import <UIKit/UIKit.h>

@interface NYCarouselView : UICollectionView
/**
 *  启动时钟
 */
-(void)startTimer;
/**
 *  停止时钟
 */
-(void)updateTimer;

-(instancetype)initWithFrame:(CGRect)frame imageNames:(NSArray *)imageNames;


@property (nonatomic, strong) NSArray *imageNames;

/**
 *  每个轮播图片的点击事件
 */
@property (nonatomic, copy) void(^cellDidSelectItemAtIndexPath)(UICollectionView *collection,NSIndexPath *indexPath);

@end

NYCarouselView.m

//
//  NYCarouselView.m
//  广告轮播CollectionView
//
//  Created by IOS on 15/12/26.
//  Copyright © 2015年 com.itcat.com. All rights reserved.
//

#import "NYCarouselView.h"

@interface NYCarouselView()<UICollectionViewDataSource,UICollectionViewDelegate>

@property (nonatomic, weak) UIPageControl *carouselPageControl;

@property (nonatomic, strong) NSTimer *timer;

@end
@implementation NYCarouselView

static NSString * const carouselID = @"NYCarouselView";


-(instancetype)initWithFrame:(CGRect)frame



    UICollectionViewFlowLayout *carouseLayout = [[UICollectionViewFlowLayout alloc]init];

    carouseLayout.itemSize = frame.size;// 设置cell的尺寸

    carouseLayout.minimumLineSpacing = 0;// 清空行距

    carouseLayout.scrollDirection = UICollectionViewScrollDirectionHorizontal;// 设置滚动的方向

    [self registerClass:[UICollectionViewCell class] forCellWithReuseIdentifier:carouselID];

    self.dataSource = self;
    self.delegate = self;


    [self startTimer];

    return [super initWithFrame:frame collectionViewLayout:carouseLayout];



-(instancetype)initWithFrame:(CGRect)frame imageNames:(NSArray *)imageNames


    self.imageNames = imageNames;
    [self scrollViewDidScroll:self];
    return [self initWithFrame:frame];


-(void)layoutSubviews
    [super layoutSubviews];
    self.bounces = NO;//去掉弹簧效果
    self.showsHorizontalScrollIndicator = NO;//去掉水平显示的拖拽线
    self.pagingEnabled = YES;//分页效果


#pragma mark - UICollectionViewDataSource,UICollectionViewDelegate

-(NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section

    return self.imageNames.count;


-(UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath

    UICollectionViewCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:carouselID forIndexPath:indexPath];

    UIImageView *imageView = [[UIImageView alloc]initWithImage:[UIImage imageNamed:self.imageNames[indexPath.row]]];
    cell.backgroundView = imageView;


    return cell;


-(void)collectionView:(UICollectionView *)collectionView didSelectItemAtIndexPath:(NSIndexPath *)indexPath

    self.cellDidSelectItemAtIndexPath(collectionView,indexPath);



#pragma mark - 分页
//分页控件的监听方法
-(void)pageChanged:(UIPageControl *)page

    [self.timer invalidate];
    //根据页数,调整滚动视图中得图片位置contentOffset
    CGFloat x = page.currentPage * self.bounds.size.width;
    [self setContentOffset:CGPointMake(x, 0) animated:YES];
    [self startTimer];


#pragma mark - 时钟
/**启动时钟*/
-(void)startTimer


    self.timer = [NSTimer scheduledTimerWithTimeInterval:2.0 target:self selector:@selector(updateTimer) userInfo:nil repeats:YES];

    //添加运行循环
    [[NSRunLoop currentRunLoop]addTimer:self.timer forMode:NSRunLoopCommonModes];



-(void)updateTimer

    //页号发生变化
    //(当前页数 + 1) % 总页数
    NSUInteger count = self.imageNames.count;
    if (count == 0) 
        NSLog(@"图片个数是0");
        return;
    
    int page = (self.carouselPageControl.currentPage+1) % (int)count;
    self.carouselPageControl.currentPage = page;
    //调用监听方法。让滚动视图滚动
    [self pageChanged:self.carouselPageControl];


/**
 抓住图片时,停止时钟,松手后,开启时钟
 */
-(void)scrollViewWillBeginDragging:(UIScrollView *)scrollView

    //停止时钟,停止后就不能在使用,如果要启用时钟,需要重新实例化
    [self.timer invalidate];



-(void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate


    //启动时钟
    [self startTimer];



#pragma mark - UIScrollView代理
// 只要一滚动就会调用
- (void)scrollViewDidScroll:(UIScrollView *)scrollView

    //    NSLog(scrollView.);
    // 获取当前的偏移量,计算当前第几页
    int page = scrollView.contentOffset.x / scrollView.bounds.size.width + 0.5;

    // 设置页数
    self.carouselPageControl.currentPage = page;




#pragma mark - 懒加载
-(UIPageControl *)carouselPageControl

    if (_carouselPageControl == nil) 

        UIPageControl * carouselPageControl = [[UIPageControl alloc]init];

        //总页数
        carouselPageControl.numberOfPages = self.imageNames.count;
        //控件尺寸
        CGSize size = [_carouselPageControl sizeForNumberOfPages:self.imageNames.count];

        carouselPageControl.bounds = CGRectMake(0, 0, size.width, size.height);
        //pageControl的位置
        carouselPageControl.center = CGPointMake(self.center.x, self.bounds.size.height * 0.85);

        //设置颜色
        carouselPageControl.pageIndicatorTintColor = [UIColor redColor];

        carouselPageControl.currentPageIndicatorTintColor = [UIColor blackColor];

        //添加监听方法
        [carouselPageControl addTarget:self action:@selector(pageChanged:) forControlEvents:UIControlEventValueChanged];
        [self.window addSubview:carouselPageControl];
        _carouselPageControl = carouselPageControl;
    
    return _carouselPageControl;

-(NSArray *)imageNames
    if (_imageNames == nil) 
        _imageNames = [NSArray array];
    
    return _imageNames;



@end

以上是关于猫猫学iOS 之广告轮播图,collectionView制作(源码)的主要内容,如果未能解决你的问题,请参考以下文章

猫猫学iOS之UITextField全解

猫猫学iOS之UITextField右边设置图片,以及UITextField全解

猫猫学iOS之UIButton一行代码重写图片和标题位置

猫猫学iOS(五十五)多线程网络之图片下载框架之SDWebImage

猫猫学iOS 之第一次打开Xcode_git配置,git简单学习

猫猫学iOS之UITextField右边设置图片,以及UITextField全解