一句代码调用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






  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值