1 #import <UIKit/UIKit.h>
2
3 typedef void(^Click)(NSInteger index);
4
5 @interface SLRoateView : UIView
6 /*
7 // tableView 中cell的复用机制始终没整出来 所以现在只能放image 放tableview没有意义 因为怎么都要创建数组这么多个tableview
8 {
9 // 当scrollView装载的别的View 而不是imageView 比如一些App中scrollVeiw上放的的tableView 等等用以分类展示的view 像爱奇艺首页的电影、电视、综艺、动漫 这样就不允许有轮播和点击属性
10
11 // 是否允许轮播 默认允许 NO
12 @property(nonatomic, assign)BOOL AllowCarousel;
13
14 // 是否支持点击 只需判断block 是否为空 为空则不添加手势
15 @property(nonatomic, assign)BOOL SupportInteraction;
16 }
17 */
18 // 创建
19 + (SLRoateView *)roateViewWithFrame:(CGRect)frame array:(NSArray *)array click:(Click)click;
20
21 //- (instancetype)initWithFrame:(CGRect)frame array:(NSArray *)array click:(Click)click;
22
23 @end
#import "SLRoateView.h"
@interface SLRoateView ()<UIScrollViewDelegate>
@property(nonatomic, strong)NSArray *array;
@property(nonatomic, copy)Click click;
@property(nonatomic, assign)CGFloat KRoateWidth;
@property(nonatomic, assign)CGFloat KRoateHeight;
@property(nonatomic, strong)UIImageView *leftImageView;
@property(nonatomic, strong)UIImageView *centerImageView;
@property(nonatomic, strong)UIImageView *rightImageView;
@property(nonatomic, assign)NSInteger index;
@property(nonatomic, strong)UIPageControl *pageControl;
@property(nonatomic, strong)NSTimer *timer;
@property(nonatomic, strong)UIScrollView *scroll;
@end
@implementation SLRoateView
+ (SLRoateView *)roateViewWithFrame:(CGRect)frame array:(NSArray *)array click:(Click)click
{
SLRoateView *roateView = [[SLRoateView alloc]initWithFrame:frame array:array click:click];
return roateView;
}
- (instancetype)initWithFrame:(CGRect)frame array:(NSArray *)array click:(Click)click
{
self = [super initWithFrame:frame];
if (self) {
self.KRoateWidth = frame.size.width;
self.KRoateHeight = frame.size.height;
self.array = array;
self.click = click;
// scrollVeiw 设置
self.scroll = [[UIScrollView alloc]initWithFrame:CGRectMake(0, 0, _KRoateWidth, _KRoateHeight)];
self.scroll.contentSize = CGSizeMake(_KRoateWidth * 3, 0);
self.scroll.pagingEnabled = YES;
self.scroll.contentOffset = CGPointMake(_KRoateWidth, 0);
self.scroll.alwaysBounceVertical = NO;
self.scroll.showsVerticalScrollIndicator = NO;
self.scroll.alwaysBounceHorizontal = YES;
self.scroll.showsHorizontalScrollIndicator = NO;
self.scroll.delegate = self;
[self addSubview:_scroll];
[self addGestureRecognizer];
[self addImageViews];
[self setDefautImage];
[self addPageControl];
[self addTimer];
}
return self;
}
#pragma mark 添加计时器
- (void)addTimer
{
// 在子线程中创建一个计时器 是图片实现轮播
dispatch_async(dispatch_get_global_queue(0, 0), ^{
_timer = [NSTimer timerWithTimeInterval:3 target:self selector:@selector(rotaView) userInfo:nil repeats:YES];
[[NSRunLoop currentRunLoop] addTimer:_timer forMode:NSRunLoopCommonModes];
[[NSRunLoop currentRunLoop] run];
});
}
- (void)rotaView
{
[_scroll setContentOffset:CGPointMake(_KRoateWidth * 2, 0) animated:YES];
NSLog(@"%ld", _index);
// 设置分页 由于动画是从中间移动到第三张 所以pageControl要显示的不是中间图片而是第三张图片
_pageControl.currentPage = (_index + 1) % _array.count;
if (_scroll.contentOffset.x/_KRoateWidth == 2)
{
[self reloadImage];
// scrollView 回到中间
[self.scroll setContentOffset:CGPointMake(_KRoateWidth, 0) animated:NO];
}
}
#pragma mark 添加点击事件
- (void)addGestureRecognizer
{
[self addGestureRecognizer:[[UITapGestureRecognizer alloc]initWithTarget:self action:@selector(tapGestureRecognizer)]];
}
- (void)tapGestureRecognizer
{
if (_click)
{
// 用当前的
self.click(_pageControl.currentPage);
}
}
#pragma mark 添加图片控件
- (void)addImageViews
{
_leftImageView = [[UIImageView alloc]initWithFrame:CGRectMake(0, 0, _KRoateWidth, _KRoateHeight)];
// imageView 大小不会改变 UIViewContentModeScaleAspectFit 只是image大小变化了
// _leftImageView.contentMode = UIViewContentModeScaleAspectFit;
[self.scroll addSubview:_leftImageView];
_centerImageView = [[UIImageView alloc]initWithFrame:CGRectMake(_KRoateWidth, 0, _KRoateWidth, _KRoateHeight)];
// _centerImageView.contentMode = UIViewContentModeScaleAspectFit;
[self.scroll addSubview:_centerImageView];
_rightImageView = [[UIImageView alloc]initWithFrame:CGRectMake(_KRoateWidth * 2, 0, _KRoateWidth, _KRoateHeight)];
// _rightImageView.contentMode = UIViewContentModeScaleAspectFit;
[self.scroll addSubview:_rightImageView];
NSLog(@" %f %f %f", _leftImageView.frame.size.height, _centerImageView.frame.size.height, _rightImageView.frame.size.height);
}
#pragma mark 设置默认显示图片
- (void)setDefautImage
{
_leftImageView.image = _array[_array.count - 1];
_centerImageView.image = _array[0];
_rightImageView.image = _array[1];
_index = 0;
_pageControl.currentPage = _index;
}
#pragma mark 添加分页控件
- (void)addPageControl
{
// 根据页数放回UIPageControl合适的大小 返回(0,0)不知道为啥 ----先要创建出来再给frame
_pageControl = [[UIPageControl alloc]init];
CGSize size = [_pageControl sizeForNumberOfPages:_array.count];
_pageControl.frame = CGRectMake(0, 0, size.width, size.height);
_pageControl.center = CGPointMake(_KRoateWidth / 2, _KRoateHeight - size.height/2);
_pageControl.numberOfPages = _array.count;
[self addSubview:_pageControl];
}
//#pragma mark 拖拽事件
//- (void)scrollViewDidScroll:(UIScrollView *)scrollView
//{
// if (scrollView.isDragging)
// {
// NSLog(@"关闭定时器");
// [_timer setFireDate:[NSDate distantFuture]];
// }
// if (!scrollView.isDragging)
// {
// NSLog(@"asdfasdf");
// }
//}
#pragma mark 滚动停止事件
- (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView
{
// 5秒后启动计时器
[_timer performSelector:@selector(setFireDate:) withObject:[NSDate distantPast] afterDelay:5];
[self reloadImage];
// scrollView 回到中间
[self.scroll setContentOffset:CGPointMake(_KRoateWidth, 0) animated:NO];
// 设置分页
_pageControl.currentPage = _index;
}
#pragma mark 重新加载图片
- (void)reloadImage
{
NSInteger leftIndex, rigtIndex;
CGPoint offset = self.scroll.contentOffset;
if (offset.x > _KRoateWidth)
{
_index = (_index + 1) % _array.count;
}else if (offset.x < _KRoateWidth)
{
_index = (_index + _array.count - 1) % _array.count;
}
_centerImageView.image = _array[_index];
leftIndex = (_index + _array.count - 1) % _array.count;
rigtIndex = (_index + 1) % _array.count;
_leftImageView.image = _array[leftIndex];
_rightImageView.image = _array[rigtIndex];
}
- (void)scrollViewWillBeginDragging:(UIScrollView *)scrollView
{
if (scrollView.isDragging)
{
// 取消timer之前的执行请求
[NSObject cancelPreviousPerformRequestsWithTarget:_timer];
// 关闭定时器
[_timer setFireDate:[NSDate distantFuture]];
}
}