一句代碼調用UUIScrollView 爲底的無限循環

//

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






發佈了32 篇原創文章 · 獲贊 23 · 訪問量 2萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章