//
// 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