//
// WsqflyScrollView.h
// UIScrollview无限循环
//
// Created by webapps on 17/1/11.
// Copyright © 2017年 webapps. All rights reserved.
//
/*思路:5-1-2-3-4-5-1 这样就形成了首尾相连*/
#import <UIKit/UIKit.h>
#define WSQFLYSTRONG @property(nonatomic,strong)
#define WSQFLYASSIGN @property(nonatomic,assign)
typedef NS_ENUM(NSUInteger,WsqflyScrollViewImageType){
WsqflyScrollViewImageTypeURL = 0, //图片是网络加载的
WsqflyScrollViewImageTypeLOCAL = 1 //图片是本地图片
};
typedef NS_ENUM(NSUInteger,WsqflyScrollViewTheTimer){
WsqflyScrollViewTheTimerOPEN = 0, //开启定时滚动
WsqflyScrollViewTheTimerCLOSE = 1 //不开定时滚动
};
typedef void(^returenIndexBlock)(NSInteger index); //返回点击第几张的BLOCK
@interface WsqflyScrollView : UIView
WSQFLYASSIGN NSNumber * times; //定时滚动的时间 默认3s
WSQFLYASSIGN BOOL NOPageController; //是否要小圆点 默认要
WSQFLYSTRONG UIColor *pageControllerColor; //小点没选择颜色 默认灰色
WSQFLYSTRONG UIColor *pageControllerSelsectColor; //小点选中颜色 默认红色
WSQFLYSTRONG returenIndexBlock returnIndexblock; //返回点击了第几张
/**初始化 必须的
* 图片来源(url/本地图片)
* 是否自动轮播
* 如果要调用上面那些属性方法,请一定在这个初始化方法之前
*/
- (void)initScrollViewImageFrom:(WsqflyScrollViewImageType)imageType theTimer:(WsqflyScrollViewTheTimer) timer imageArray:(NSArray *)imageArray;
@end
//
// WsqflyScrollView.m
// UIScrollview无限循环
//
// Created by webapps on 17/1/11.
// Copyright © 2017年 webapps. All rights reserved.
//
#import "WsqflyScrollView.h"
#import "UIImageView+WebCache.h"
#define SelfViewWIDTH self.bounds.size.width
#define SelfViewHEIGHT self.bounds.size.height
#define ScrollViewWIDTH self.wScrollView.frame.size.width
#define ScrollViewHEIGHT self.wScrollView.frame.size.height
@interface WsqflyScrollView()<UIScrollViewDelegate>
WSQFLYSTRONG UIScrollView *wScrollView; // 打底Scrollview
WSQFLYSTRONG UIPageControl *wPageControl; // 小圆点控件
WSQFLYSTRONG NSArray *datas; // 图片数据源
WSQFLYSTRONG NSTimer *myTimer; // 定时器
WSQFLYASSIGN BOOL NOAutoTimer; //是否开启自动轮播
WSQFLYASSIGN NSInteger timerPage; //开启定时滑动时的当前页数
@end
@implementation WsqflyScrollView
#pragma MARK --初始化
- (void)initScrollViewImageFrom:(WsqflyScrollViewImageType)imageType theTimer:(WsqflyScrollViewTheTimer)timer imageArray:(NSArray *)imageArray{
self.datas = [NSArray arrayWithArray:imageArray];
if (timer == WsqflyScrollViewTheTimerOPEN) {
self.NOAutoTimer = NO;// 开启定时
}else{
self.NOAutoTimer = YES; // 不开启定时
}
[self initUIScrollView];
[self initUIPageController];
[self setImageOnUIScrollView:imageType];
[self justIsAutoTimer];
}
#pragma MARK----创建UIScrolloView
- (void)initUIScrollView{
_wScrollView = [[UIScrollView alloc] initWithFrame:CGRectMake(0, 0, SelfViewWIDTH, SelfViewHEIGHT)];
_wScrollView.bounces = YES;
_wScrollView.pagingEnabled = YES;
_wScrollView.delegate = self;
_wScrollView.userInteractionEnabled = YES;
_wScrollView.showsHorizontalScrollIndicator = NO;
_wScrollView.showsVerticalScrollIndicator = NO;
if(_datas.count < 2){//如果图片数组只有1张,那就不无限循环了
_wScrollView.scrollEnabled = NO;
}
[self addSubview:_wScrollView];
}
#pragma MARK----创建UIPageController
- (void)initUIPageController{
_wPageControl = [[UIPageControl alloc] initWithFrame:CGRectMake((ScrollViewWIDTH - 100)/2,ScrollViewHEIGHT - 18 , 100, 15)];
[_wPageControl setCurrentPageIndicatorTintColor:self.pageControllerSelsectColor ? self.pageControllerColor : [UIColor redColor]];
[_wPageControl setPageIndicatorTintColor:self.pageControllerColor ? self.pageControllerSelsectColor : [UIColor grayColor]];
_wPageControl.numberOfPages = [_datas count];
_wPageControl.currentPage = 0;
if(self.datas.count < 2){//如果图片数组只有1张,那就不显示小圆圈了
_wPageControl.hidden = YES;
}
[self addSubview:_wPageControl];
if (!self.NOPageController) {// 需要小圆点
}else{
/*Toop: 不要小圆点 */
_wPageControl.hidden = YES;
}
}
#pragma MARK --- 排放图片
- (void)setImageOnUIScrollView:(WsqflyScrollViewImageType)imageType{
for (NSInteger i = 0; i < _datas.count; i++) {
UIImageView *imageView = [[UIImageView alloc] init];
imageView.contentMode = UIViewContentModeScaleAspectFit;
if (imageType == WsqflyScrollViewImageTypeURL) {
[imageView sd_setImageWithURL:[NSURL URLWithString:_datas[i]] placeholderImage:[UIImage imageNamed:@"meinv.jpg"]];
}else{
imageView.image =[UIImage imageNamed:_datas[i]];
}
imageView.userInteractionEnabled = YES;
UITapGestureRecognizer *pan = [[UITapGestureRecognizer alloc]init];
[pan addTarget:self action:@selector(imageViewAction:)];
[imageView addGestureRecognizer:pan];
pan.view.tag = 5000 +i;
// 首页是第0页,放的是最后一张 ,最后一张再加上第一张,所以默认从第1页开始的。
imageView.frame = CGRectMake(ScrollViewWIDTH * i + ScrollViewWIDTH, 0, ScrollViewWIDTH, ScrollViewHEIGHT);
[_wScrollView addSubview:imageView];
}
// 取数组最后一张图片 放在第0页
UIImageView *firstImage = [[UIImageView alloc] init];
if (imageType == WsqflyScrollViewImageTypeURL) {
[firstImage sd_setImageWithURL:[NSURL URLWithString:_datas[_datas.count - 1]] placeholderImage:[UIImage imageNamed:@"meinv.jpg"]];
}else{
firstImage.image =[UIImage imageNamed:_datas[_datas.count - 1]];
}
firstImage.frame = CGRectMake(0, 0, ScrollViewWIDTH, ScrollViewHEIGHT);
[_wScrollView addSubview:firstImage];
// 取数组的第一张图片 放在最后1页
UIImageView *endImage = [[UIImageView alloc] init];
endImage.contentMode = UIViewContentModeScaleAspectFit;
if (imageType == WsqflyScrollViewImageTypeURL) {
[endImage sd_setImageWithURL:[NSURL URLWithString:_datas[0]] placeholderImage:[UIImage imageNamed:@"meinv.jpg"]];
}else{
firstImage.image =[UIImage imageNamed:_datas[0]];
}
endImage.frame = CGRectMake((_datas.count + 1) * ScrollViewWIDTH, 0, ScrollViewWIDTH, ScrollViewHEIGHT);
[_wScrollView addSubview:endImage];
[_wScrollView setContentSize:CGSizeMake(ScrollViewWIDTH * (_datas.count + 2), ScrollViewHEIGHT)]; // 6 0 1 2 3 4 5 6 0 原理,在第一个前加上最后一个,在最后一个后加上第一个
[_wScrollView setContentOffset:CGPointMake(0, 0)];
[_wScrollView scrollRectToVisible:CGRectMake(ScrollViewWIDTH, 0, ScrollViewWIDTH, ScrollViewHEIGHT) animated:NO];
}
#pragma MARK --- 是否开启自动轮播
-(void)justIsAutoTimer{
if (!self.NOAutoTimer) {
if (!self.times) {
self.times = [NSNumber numberWithFloat:3.0];
}
self.myTimer= [NSTimer timerWithTimeInterval:[self.times floatValue] target:self selector:@selector(starTimerPage)userInfo:nil repeats:YES];
[[NSRunLoop currentRunLoop] addTimer: self.myTimer forMode:NSDefaultRunLoopMode];
}else{
/*Toop: 不开启自动轮播*/
}
}
#pragma MARK --- 根据定时器改变scrollview的原点
- (void)turnPage:(NSInteger)page
{
_timerPage = page;
[self.wScrollView scrollRectToVisible:CGRectMake(ScrollViewWIDTH * (page + 1), 0, ScrollViewWIDTH, ScrollViewHEIGHT) animated:YES];
}
#pragma MARK ---- 开启定时器
- (void)starTimerPage
{
NSInteger page = self.wPageControl.currentPage;
page ++;
[self turnPage:page];
}
#pragma MARK ---UISctollViewDeagte
//UIscrollView 有变化就进
- (void)scrollViewDidScroll:(UIScrollView *)scrollView
{
NSInteger page = floor((self.wScrollView.contentOffset.x - ScrollViewWIDTH/([_datas count]+2))/ScrollViewWIDTH) + 1;
NSLog(@"page____xxxx:%ld",page);
page --; //默认从第二页开始
self.wPageControl.currentPage = page;
NSLog(@"_wPageControl.currentPage_____xxxx:%ld",_wPageControl.currentPage);
}
//UIscrollView 滑动停止就进
- (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView
{
NSInteger currentPage = floor((self.wScrollView.contentOffset.x - ScrollViewWIDTH/ ([_datas count]+2)) / ScrollViewWIDTH) + 1;
if (currentPage == 0) {
[self.wScrollView scrollRectToVisible:CGRectMake(ScrollViewWIDTH * _datas.count, 0, ScrollViewWIDTH, ScrollViewHEIGHT) animated:NO];
}else if(currentPage == _datas.count + 1){
[self.wScrollView scrollRectToVisible:CGRectMake(ScrollViewWIDTH, 0, ScrollViewWIDTH,ScrollViewHEIGHT) animated:NO];
}else{
}
}
//当 setContentOffset/scrollRectVisible:animated: 完成就进入
- (void)scrollViewDidEndScrollingAnimation:(UIScrollView *)scrollView
{
if (!self.NOAutoTimer){
if (_timerPage == 0) {
[_wScrollView scrollRectToVisible:CGRectMake(ScrollViewWIDTH * _datas.count, 0, ScrollViewWIDTH, ScrollViewHEIGHT) animated:NO];
}
else if(_timerPage == _datas.count){
[_wScrollView scrollRectToVisible:CGRectMake(ScrollViewWIDTH, 0, ScrollViewWIDTH,ScrollViewHEIGHT) animated:NO];
}
}
}
#pragma MARK --- 图片的点击事件
-(void)imageViewAction:(UITapGestureRecognizer *)pan{
NSInteger index = pan.view.tag ;
if (self.returnIndexblock) {
self.returnIndexblock(index -5000);
}
}
@end