美文网首页
iOS开发-轮播图

iOS开发-轮播图

作者: 凡尘_iOS | 来源:发表于2016-12-15 16:50 被阅读0次

    #import "CLLCarouselView.h"@interface CLLCarouselView ()/**

    左边的图片 -- 上一张

    */

    @property (nonatomic, strong)UIImageView * leftImageView;

    /**

    中间的图片 -- 显示的图片

    */

    @property (nonatomic, strong)UIImageView * centerImageView;

    /**

    右边的图片 -- 下一张

    */

    @property (nonatomic, strong)UIImageView * rightImageView;

    /**

    滚动图

    */

    @property (nonatomic, strong)UIScrollView * contentView;

    /**

    分页点

    */

    @property (nonatomic, strong)UIPageControl * pageControl;

    /**

    显示图片的下标

    */

    @property (nonatomic, assign)int pageIndex;

    /**

    定时器

    */

    @property (nonatomic, strong)NSTimer * aTimer;

    @end

    @implementation CLLCarouselView

    - (instancetype)initWithFrame:(CGRect)frame

    {

    self = [super initWithFrame:frame];

    if (self) {

    [self setupSubviews];

    //        self.backgroundColor = [UIColor magentaColor];

    }

    return self;

    }

    - (void)setupSubviews

    {

    self.contentView = [[UIScrollView alloc] initWithFrame:self.bounds];

    _contentView.pagingEnabled = YES;

    _contentView.showsVerticalScrollIndicator = NO;

    _contentView.showsHorizontalScrollIndicator = NO;

    _contentView.alwaysBounceHorizontal = YES;

    _contentView.contentSize = CGSizeMake(self.width * 3, 0);

    //    _contentView.backgroundColor = [UIColor redColor];

    _contentView.delegate = self;

    [self addSubview:_contentView];

    self.leftImageView = [[UIImageView alloc] initWithFrame:_contentView.bounds];

    _leftImageView.left = 0;

    //    _leftImageView.backgroundColor = MHCustomColor;

    [_contentView addSubview:_leftImageView];

    self.centerImageView = [[UIImageView alloc] initWithFrame:_contentView.bounds];

    //中间位置-- 固定

    _centerImageView.left = _leftImageView.right;

    _centerImageView.userInteractionEnabled = YES;

    UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(carouselTapAction:)];

    //添加轻按手势 --- 只有中间显示图片有, 其他两张不能点击

    [_centerImageView addGestureRecognizer:tap];

    //    _centerImageView.backgroundColor = MHCustomColor;

    [_contentView addSubview:_centerImageView];

    self.rightImageView = [[UIImageView alloc] initWithFrame:_contentView.bounds];

    //屏幕右边位置 --固定

    _rightImageView.left = _centerImageView.right;

    //    _rightImageView.backgroundColor = MHCustomColor;

    [_contentView addSubview:_rightImageView];

    self.pageControl = [[UIPageControl alloc] initWithFrame:CGRectMake(10, self.height - 25, self.width - 20, 15)];

    _pageControl.tintColor = [UIColor whiteColor];

    [self addSubview:_pageControl];

    _contentView.contentOffset = CGPointMake(_leftImageView.right, 0);

    }

    /**

    手势关联方法 -- 调用block回调, 传出点击的图片下标

    @param tap 图片轻按手势

    */

    - (void)carouselTapAction:(UITapGestureRecognizer *)tap

    {

    if (self.selectCarouselImageBlock) {

    self.selectCarouselImageBlock(_pageIndex);

    }

    }

    /**

    设置图片数组

    @param imagesAry 图片名称数组

    */

    - (void)setImagesAry:(NSArray *)imagesAry

    {

    _imagesAry = imagesAry;

    _pageIndex = 0;

    if (_imagesAry.count > 1) {

    //不是一张图片 -- 添加定时器

    [self addTimer];

    _pageControl.numberOfPages = imagesAry.count;

    _leftImageView.image = [UIImage imageNamed:[imagesAry lastObject]];

    //显示第一张图片

    _centerImageView.image = [UIImage imageNamed:imagesAry[0]];

    _rightImageView.image = [UIImage imageNamed:imagesAry[1]];

    _contentView.scrollEnabled = YES;

    _contentView.contentOffset = CGPointMake(_leftImageView.right, 0);

    }else

    {

    //如果是只有一张, 不能滚动

    _centerImageView.image = [UIImage imageNamed:imagesAry[0]];

    _contentView.scrollEnabled = NO;

    }

    }

    - (void)scrollViewWillBeginDragging:(UIScrollView *)scrollView

    {

    //拖拽的时候, 定时器暂时关闭

    [self.aTimer invalidate];

    }

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

    {

    //拖拽结束, 定时器重新添加

    [self addTimer];

    }

    - (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView

    {

    //判断是否是向后滑动

    if (_contentView.contentOffset.x > _contentView.width * 1.5) {

    //判断当前显示图片是不是最后一张

    if (_pageIndex == _imagesAry.count - 1) {

    _leftImageView.image = [UIImage imageNamed:_imagesAry[_imagesAry.count - 1]];

    _centerImageView.image = [UIImage imageNamed:_imagesAry[0]];

    _rightImageView.image = [UIImage imageNamed:_imagesAry[1]];

    _pageIndex = 0;

    }else

    {

    _leftImageView.image = [UIImage imageNamed:_imagesAry[_pageIndex]];

    _centerImageView.image = [UIImage imageNamed:_imagesAry[_pageIndex + 1]];

    _rightImageView.image = [UIImage imageNamed:_pageIndex + 1 == _imagesAry.count - 1 ? _imagesAry[0] : _imagesAry[_pageIndex + 2]];

    _pageIndex += 1;

    }

    }else if (_contentView.contentOffset.x < _contentView.width * 0.5)

    {

    if (_pageIndex == 0) {

    _leftImageView.image = [UIImage imageNamed:_imagesAry.count - 1 == 0 ? _imagesAry[_imagesAry.count - 1] : _imagesAry[_imagesAry.count - 2]];

    _centerImageView.image = [UIImage imageNamed:_imagesAry[_imagesAry.count - 1]];

    _rightImageView.image = [UIImage imageNamed:_imagesAry[0]];

    _pageIndex = (int)_imagesAry.count - 1;

    }else

    {

    _leftImageView.image = [UIImage imageNamed: _pageIndex - 1 == 0 ? _imagesAry[_imagesAry.count - 1] : _imagesAry[_pageIndex - 2]];

    _centerImageView.image = [UIImage imageNamed:_imagesAry[_pageIndex - 1]];

    _rightImageView.image = [UIImage imageNamed:_imagesAry[_pageIndex]];

    _pageIndex -= 1;

    }

    }

    _pageControl.currentPage = _pageIndex;

    //图片替换完成后, 返回到中间位置

    _contentView.contentOffset = CGPointMake(_leftImageView.right, 0);

    }

    /** 添加定时器 */

    - (void)addTimer

    {

    if (![self.aTimer isValid]) {

    NSTimer *timer = [NSTimer timerWithTimeInterval:4.0f target:self selector:@selector(nextPage) userInfo:nil repeats:YES];

    [[NSRunLoop currentRunLoop] addTimer:timer forMode:NSDefaultRunLoopMode];

    self.aTimer = timer;

    }

    }

    - (void)nextPage

    {

    [UIView animateWithDuration:0.5 animations:^{

    _contentView.contentOffset = CGPointMake(_centerImageView.right, 0);

    } completion:^(BOOL finished) {

    if (_pageIndex == _imagesAry.count - 1) {

    _leftImageView.image = [UIImage imageNamed:_imagesAry[_imagesAry.count - 1]];

    _centerImageView.image = [UIImage imageNamed:_imagesAry[0]];

    _rightImageView.image = [UIImage imageNamed:_imagesAry[1]];

    _pageIndex = 0;

    }else

    {

    _leftImageView.image = [UIImage imageNamed:_imagesAry[_pageIndex]];

    _centerImageView.image = [UIImage imageNamed:_imagesAry[_pageIndex + 1]];

    _rightImageView.image = [UIImage imageNamed:_pageIndex + 1 == _imagesAry.count - 1 ? _imagesAry[0] : _imagesAry[_pageIndex + 2]];

    _pageIndex += 1;

    }

    _pageControl.currentPage = _pageIndex;

    _contentView.contentOffset = CGPointMake(_leftImageView.right, 0);

    }];

    }

    /*

    // Only override drawRect: if you perform custom drawing.

    // An empty implementation adversely affects performance during animation.

    - (void)drawRect:(CGRect)rect {

    // Drawing code

    }

    */

    @end

    #import/**

    主页面轮播图

    */

    @interface CLLCarouselView : UIView

    /**

    图片数组, 传图片的名称数组

    */

    @property (nonatomic, copy)NSArray * imagesAry;

    /**

    点击图片回调block -- index图片下标

    */

    @property(nonatomic, copy)void(^selectCarouselImageBlock)(NSInteger index);

    @end

    相关文章

      网友评论

          本文标题:iOS开发-轮播图

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