iOS开发-轮播图

#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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容