在使用的地方调用- (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