轮播图封装

在使用的地方调用- (void)bindImageArray:(NSArray *)imageArray;参数为一个存有图片名的数组

如果想实现自动轮播调用- (void)setSpeed:(double)timeInterval;参数为两张图片转换的时间间隔(单位:秒)

在.h文件中

#import <UIKit/UIKit.h>

@interface CFCircleSlide : UIView

//轮播图实现的方法(手动轮播)
- (void)bindImageArray:(NSArray *)imageArray;

//设置轮播的速度(在调用手动轮播的基础上实现的自动轮播)
//注:此方法适用2张及以上的图片轮播
- (void)setSpeed:(double)timeInterval;

@end

在.m文件中

#import "CFCircleSlide.h"

@interface CFCircleSlide ()<UIScrollViewDelegate>

//三个字符串,是保存imageView上显示图片的名字
@property (nonatomic, copy) NSString *centerImageNamed;
@property (nonatomic, copy) NSString *leftImageNamed;
@property (nonatomic, copy) NSString *rightImageNamed;
//三个imageView是正常显示图片的
@property (nonatomic, strong) UIImageView *centerImageView;
@property (nonatomic, strong) UIImageView *leftImageView;
@property (nonatomic, strong) UIImageView *rightImageView;
//存储图片名字的数组
@property (nonatomic, strong) NSMutableArray *imageArray;
//放三个imageView的父视图
@property (nonatomic, strong) UIScrollView *scrollView;
//UIPageControl
@property (nonatomic, strong) UIPageControl *pages;
//定时器
@property (nonatomic, strong) NSTimer *timer;
//是否启动了定时器
@property (nonatomic, assign) BOOL isTimerStart;
//定时器速度
@property (nonatomic, assign) double timeInterval;

@end

@implementation CFCircleSlide

//设置自动轮播的速度
- (void)setSpeed:(double)timeInterval
{

    if (self.imageArray.count < 2) {
        return;
    }

    //设置定时器
    self.timer = [NSTimer scheduledTimerWithTimeInterval:timeInterval target:self selector:@selector(timerAction:) userInfo:nil repeats:YES];
    self.isTimerStart = YES;
    self.timeInterval = timeInterval;
    
}

//实现轮播图的方法
- (void)bindImageArray:(NSArray *)imageArray
{
    self.imageArray = [NSMutableArray arrayWithArray:imageArray];
    //把scrollView添加到自己的subView上
    [self addSubview:self.scrollView];
    if (self.imageArray.count > 1) {
        //把三个图片添加到scrollView上
        [self.scrollView addSubview:self.leftImageView];
        [self.scrollView addSubview:self.centerImageView];
        [self.scrollView addSubview:self.rightImageView];
        //保证刚出现的时候,正中间显示的是第一张照片
        //左边显示最后一张,右边显示第二张
        //核心思想:图片不动数据动
        self.centerImageNamed = self.imageArray[0];
        self.leftImageNamed = self.imageArray[self.imageArray.count - 1];
        self.rightImageNamed = self.imageArray[1];
        //把图片放到imageView上,对应位置的imageView放置对应的图片
        [self.centerImageView setImage:[UIImage imageNamed:self.centerImageNamed]];
        [self.leftImageView setImage:[UIImage imageNamed:self.leftImageNamed]];
        [self.rightImageView setImage:[UIImage imageNamed:self.rightImageNamed]];
        //设置偏移量显示centerImageView
        [self.scrollView setContentOffset:CGPointMake(self.scrollView.frame.size.width, 0)];
        //隐藏UIScrollView的滚动条--水平方向
        self.scrollView.showsHorizontalScrollIndicator = false;
        self.pages.numberOfPages = self.imageArray.count;
        self.pages.currentPage = 0;
        
    } else if (self.imageArray.count == 1) {
        //图片数组有一张图片,直接显示
        [self.scrollView addSubview:self.leftImageView];
        self.scrollView.contentSize = CGSizeMake(self.frame.size.width, 0);
        self.leftImageView.image = [UIImage imageNamed:self.imageArray[0]];
        
    } else {
        //图片数组没有图片,不做任何操作
        return;
    }
    
}

//定时器实现的轮播效果
- (void)timerAction:(NSTimer *)sender
{
    [self slideToLeft];
}

//当开始拖动时停止定时器
- (void)scrollViewWillBeginDragging:(UIScrollView *)scrollView
{
    [self.timer invalidate];
    self.timer = nil;
}

//scrollView的delegate,实现图片不动数据动的方法
- (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView
{
    
    if (scrollView.contentOffset.x == 0) {
        // 向右滑动
        [self slideToRight];
        
    } else if (scrollView.contentOffset.x == self.scrollView.bounds.size.width * 2){  //向左滑动
        //向左滑动
        [self slideToLeft];
        
    }
    
    if (self.isTimerStart) {
        //设置自动轮播
        [self setSpeed:self.timeInterval];
    }
    
}

//向右滑动
- (void)slideToRight
{
    // 替换数据源
    // 让centerImageNamed保存的是leftIamgeNamed
    // 让rightImageNamed保存的是centerImageNamed
    // 更新leftImageNamed的数据
    
    // 先替换rightImageNamed再替换centerImageNamed
    _rightImageNamed = _centerImageNamed;
    _centerImageNamed = _leftImageNamed;
    NSInteger index = [self imageOnImageArrayWithImageString:_leftImageNamed];
    
    if (index == 0) {
        _leftImageNamed = self.imageArray[self.imageArray.count - 1];
    } else {
        _leftImageNamed = self.imageArray[index - 1];
    }
    
    [self.centerImageView setImage:[UIImage imageNamed:self.centerImageNamed]];
    
    [self.leftImageView setImage:[UIImage imageNamed:self.leftImageNamed]];
    
    [self.rightImageView setImage:[UIImage imageNamed:self.rightImageNamed]];
    
    [self.scrollView setContentOffset:CGPointMake(self.scrollView.frame.size.width, 0) animated:NO];
    
    if (self.pages.currentPage == 0) {
        
        self.pages.currentPage = self.imageArray.count - 1;
        
    } else {
        
        self.pages.currentPage --;
        
    }
}

//向左滑动
- (void)slideToLeft
{
    //实现原理与向右滑动一样
    _leftImageNamed = _centerImageNamed;
    _centerImageNamed = _rightImageNamed;
    NSInteger index = [self imageOnImageArrayWithImageString:self.rightImageNamed];
    
    if (index == self.imageArray.count - 1) {
        self.rightImageNamed = self.imageArray[0];
    } else {
        self.rightImageNamed = self.imageArray[index + 1];
    }
    
    [self.centerImageView setImage:[UIImage imageNamed:self.centerImageNamed]];
    
    [self.leftImageView setImage:[UIImage imageNamed:self.leftImageNamed]];
    
    [self.rightImageView setImage:[UIImage imageNamed:self.rightImageNamed]];
    
    [self.scrollView setContentOffset:CGPointMake(self.scrollView.frame.size.width, 0) animated:NO];
    
    if (self.pages.currentPage == self.imageArray.count - 1) {
        
        self.pages.currentPage = 0;
        
    } else {
        
        self.pages.currentPage ++;
        
    }
}

- (NSInteger)imageOnImageArrayWithImageString:(NSString *)imageString
{
    for (int i = 0; i < self.imageArray.count; i++) {
        if ([imageString isEqualToString:self.imageArray[i]]) {
            return i;
        }
    }
    //不会走下面的语句,但是不写会报错
    return 0;
}

#pragma mark -- 懒加载
- (UIImageView *)leftImageView
{
    if (_leftImageView == nil) {
        _leftImageView = [[UIImageView alloc] initWithFrame:CGRectMake(0, 0, self.scrollView.frame.size.width, self.scrollView.frame.size.height)];
    }
    return _leftImageView;
}

- (UIImageView *)centerImageView
{
    if (_centerImageView == nil) {
        _centerImageView = [[UIImageView alloc] initWithFrame:CGRectMake(self.scrollView.frame.size.width, 0, self.scrollView.frame.size.width, self.scrollView.frame.size.height)];
    }
    return _centerImageView;
}

- (UIImageView *)rightImageView
{
    if (_rightImageView == nil) {
        _rightImageView = [[UIImageView alloc] initWithFrame:CGRectMake(self.scrollView.frame.size.width * 2, 0, self.scrollView.frame.size.width, self.scrollView.frame.size.height)];
    }
    return _rightImageView;
}

- (UIScrollView *)scrollView
{
    if (_scrollView == nil) {
        _scrollView = [[UIScrollView alloc] initWithFrame:self.bounds];
        _scrollView.delegate = self;
        _scrollView.bounces = NO;
        _scrollView.pagingEnabled = YES;
        _scrollView.contentSize = CGSizeMake(self.frame.size.width * 3, 0);
    }
    return _scrollView;
}

- (UIPageControl *)pages
{
    if (_pages == nil) {
        _pages = [[UIPageControl alloc] init];
        _pages.frame = CGRectMake((self.bounds.size.width - 110) / 2.0, self.scrollView.bounds.size.height - 30, 110, 30);
        //UIPageControl点的颜色
        _pages.pageIndicatorTintColor = [UIColor lightGrayColor];
        _pages.currentPageIndicatorTintColor = [UIColor orangeColor];
        [self addSubview:_pages];
    }
    return _pages;
}

@end

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值