iOS之图片循环滚动并结合手势


///

.h



#import <UIKit/UIKit.h>


//枚举,用来判断滚动方向

typedef  enum _CycleDirection

{

    PortaitDirection,//纵向滚动

    LandscapeDirection//横向滚动

} CycleDirection;


@protocol CycleScrollViewDelegate


-(void)pageViewClicked:(NSInteger)pageIndex;


@end


@interface CycleScrollView : UIView <UIScrollViewDelegate>{

    

    CycleDirection scrollDirection;    // scrollView滚动的方向

    UIScrollView *scrollView;

    

    NSArray *imagesArray;   // 存放所有需要滚动的图片

    

    NSMutableArray *curImages; //存放当前滚动的三张图片

    

    int totalPageCount;//图片的总张数

    

    int curPageIndex;//当前图片的索引

    

    CGRect scrollFrame;

    

    id <CycleScrollViewDelegate> delegate;

    

    int timerCount;

    

    int scrollDir;

    

    CGPoint lastScrollOffset;

}


@property (nonatomic,assign)id <CycleScrollViewDelegate> delegate;


- (NSArray*) getDisplayImagesWithPageindex;


- (int) validPageValue:(NSInteger)value;


- (void) refreshScrollView;


- (id)initWithFrame:(CGRect)frame cycleDirection:(CycleDirection)direction pictures:(NSArray*)pictureArray;


-(void)ButtonClicked;


-(void)scrollTimer;


@end


///


///

.m



#import "CycleScrollView.h"



@implementation CycleScrollView


@synthesize delegate;


- (id)initWithFrame:(CGRect)frame cycleDirection:(CycleDirection)direction pictures:(NSArray*)pictureArray

{

    self = [super initWithFrame:frame];

    if (self) {

        

        scrollFrame=frame;

        

        scrollDirection=direction;

        

        curImages=[[NSMutableArray alloc] init];

        imagesArray=[[NSArray  alloc]initWithArray:pictureArray];

        

        totalPageCount=[imagesArray count];

        

        curPageIndex=1;//当前显示的是图片数组里的第一张图片

        

        scrollView=[[UIScrollView alloc] initWithFrame:frame];

        scrollView.backgroundColor=[UIColor blueColor];

        scrollView.showsVerticalScrollIndicator=NO;

        scrollView.showsHorizontalScrollIndicator=NO;

        scrollView.pagingEnabled=YES;

        scrollView.delegate=self;

        

        if (scrollDirection == PortaitDirection)

        {//在竖直方向滚动

            scrollView.contentSize=CGSizeMake(scrollView.frame.size.width, scrollView.frame.size.height*3);

        }

        

        if(scrollDirection==LandscapeDirection)

        {//在水平方向滚动

            

            scrollView.contentSize=CGSizeMake(scrollView.frame.size.width*3, scrollView.frame.size.height);

            

        }

        

        [self  addSubview:scrollView];

        

        [self refreshScrollView];

        

        timerCount=0;

        

        scrollDir=-1;

        

        [NSTimer scheduledTimerWithTimeInterval:1 target:self selector:@selector(scrollTimer) userInfo:nil repeats:YES];

    }

    return self;

}


-(void)scrollTimer

{

    timerCount++;

    

    if (timerCount == 3) {

        timerCount=0;

        

        if (scrollDirection==LandscapeDirection) {

            [scrollView setContentOffset:CGPointMake(scrollFrame.size.width+scrollFrame.size.width*scrollDir, 0)animated:YES];

        }

        

        if (scrollDirection==PortaitDirection) {

            [scrollView setContentOffset:CGPointMake(0, scrollFrame.size.height+scrollFrame.size.height*scrollDir)animated:YES];

        }

        

    }

    

}


- (void) refreshScrollView

{

    NSArray *subViews=[scrollView subviews];

    

    if ([subViews count]>0) {

        [subViews makeObjectsPerformSelector:@selector(removeFromSuperview)];

    }

    

    [self getDisplayImagesWithPageindex];

    

    for (int i = 0 ; i < 3;  i++) {

        UIButton  *imageButton=[[UIButton alloc] init];

        

        //        UIButton  *imageButton=[UIButton buttonWithType:UIButtonTypeRoundedRect];

        [imageButton setImage:[curImages objectAtIndex:i] forState:UIControlStateNormal];

        [imageButton addTarget:self action:@selector(ButtonClicked) forControlEvents:UIControlEventTouchUpInside];

        

        if(scrollDirection==PortaitDirection){

            imageButton.frame=CGRectOffset(CGRectMake(0, 0, 320, 480), 0, scrollFrame.size.height*i);

            [scrollView setContentOffset:CGPointMake(0, scrollFrame.size.height)];

        }

        

        if(scrollDirection==LandscapeDirection) { //水平滚动

            imageButton.frame=CGRectOffset(CGRectMake(0, 0, 320, 480), scrollFrame.size.width*i, 0);

            [scrollView setContentOffset:CGPointMake(scrollFrame.size.width, 0)];

        }

        

        [scrollView addSubview:imageButton];

        [imageButton release];

    }

    

}


- (NSArray*) getDisplayImagesWithPageindex

{

    int pre=[self validPageValue:curPageIndex-1];

    

    int last=[self validPageValue:curPageIndex+1];

    

    if([curImages count]!=0)

        [curImages removeAllObjects];

    

    [curImages addObject:[imagesArray objectAtIndex:pre-1]];

    

    [curImages addObject:[imagesArray objectAtIndex:curPageIndex-1]];

    

    [curImages addObject:[imagesArray objectAtIndex:last-1]];

    

    return curImages;

}


- (int) validPageValue:(NSInteger)value

{

    

    if(value==0)

    {

        value=totalPageCount;    //value1为第一张,value=0为前面一张

    }

    

    if (value==totalPageCount+1) {

        value=1;

    }

    

    return value;

}


-(void)scrollViewDidScroll:(UIScrollView *)crollView

{

    timerCount=0;

    float x=crollView.contentOffset.x;

    

    float y=crollView.contentOffset.y;

    

    if (x==scrollFrame.size.width) {

        lastScrollOffset.x=x;

    }

    

    if (y==scrollFrame.size.height) {

        lastScrollOffset.y=y;

    }

    

    if(scrollDirection==LandscapeDirection) //水平滚动

        

    {

        

        if (x!=scrollFrame.size.width) {

            

            if (lastScrollOffset.x>x) {

                scrollDir=-1;

            }else if(lastScrollOffset.x<x){

                scrollDir=1;

            }

            

            lastScrollOffset.x=x;

        }

        

        if(x>=2*scrollFrame.size.width) //往下翻一张

            

        {

            

            curPageIndex=[self validPageValue:curPageIndex+1];

            

            [self refreshScrollView];

            

        }

        

        if(x<=0)

            

        {

            

            curPageIndex=[self validPageValue:curPageIndex-1];

            

            [self refreshScrollView];

            

        }

        

    }

    

    

    

    //竖直滚动

    

    if(scrollDirection==PortaitDirection){

        NSLog(@"");

        NSLog(@"y==%f",y);

        NSLog(@"lastScrollOffset.y==%f",lastScrollOffset.y);

        

        if (y!=scrollFrame.size.height) {

            

            if (lastScrollOffset.y>y) {

                scrollDir=-1;

            }else if(lastScrollOffset.y<y){

                scrollDir=1;

            }

            

            lastScrollOffset.y=y;

        }

        

        if(y>=2*scrollFrame.size.height)

        {

            curPageIndex=[self validPageValue:curPageIndex+1];

            

            [self refreshScrollView];

            

        }

        

        if (y<=0) {

            curPageIndex=[self validPageValue:curPageIndex-1];

            [self refreshScrollView];

        }

        

    }

    

}


-(void)ButtonClicked

{

    [delegate pageViewClicked:curPageIndex];

}



- (void)dealloc

{

    

    [imagesArray release];

    

    [curImages release];

    

    [super dealloc];

}


@end


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值