您的位置:首页 > 产品设计 > UI/UE

UIScrollView实现循环滚动(一)

2014-03-21 13:58 411 查看
#import <UIKit/UIKit.h>

typedef enum _CycleDirection

{ PortaitDirection,LandscapeDirection } CycleDirection;

@interface CycleScrollView : UIView<UIScrollViewDelegate>
{

UIScrollView *scrollView;

UIImageView *curImageView;

int totalPage;

int curPage;

CGRect scrollFrame;

CycleDirection scrollDirection; //
scrollView滚动的方向

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

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

}

- (int) validPageValue:(NSInteger)value;

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

- (NSArray*) getDisplayImagesWithCurpage:(int)page;

- (void) refreshScrollView;

@end

//

// CycleScrollView.m

// CycleScrollView

//

// Created by mini5 on 28/07/2011.

// Copyright 2011 __MyCompanyName__. All rights reserved.

//

#import "CycleScrollView.h"

@implementation CycleScrollView

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

{

self=[super initWithFrame:frame];

if(self)

{

scrollFrame=frame;

scrollDirection=direction;

totalPage=[pictureArray count];

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

curImages=[[NSMutableArray alloc] init];

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

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

scrollView.backgroundColor=[UIColor blueColor];

scrollView.showsHorizontalScrollIndicator=NO;

scrollView.showsVerticalScrollIndicator=NO;

scrollView.pagingEnabled=YES;

scrollView.delegate=self;

[self addSubview:scrollView];

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];

}

return self;

}

- (void) refreshScrollView

{

NSArray *subViews=[scrollView subviews];

if([subViews count]!=0)

{

[subViews makeObjectsPerformSelector:@selector(removeFromSuperview)];

}

[self getDisplayImagesWithCurpage:curPage];

UIImage *preImage=[curImages objectAtIndex:0];

UIImage *curImage=[curImages objectAtIndex:1];

UIImage *lastImage=[curImages objectAtIndex:2];

UIImageView *preView=[[UIImageView alloc] initWithImage:preImage];

UIImageView *curView=[[UIImageView alloc] initWithImage:curImage];

UIImageView *lastView=[[UIImageView alloc] initWithImage:lastImage];

[scrollView addSubview:preView];

[scrollView addSubview:curView];

[scrollView addSubview:lastView];

[preView release];

[curView release];

[lastView release];

if(scrollDirection==PortaitDirection)
//竖直滚动

{

preView.frame=CGRectOffset(preView.frame, 0, 0);

curView.frame=CGRectOffset(curView.frame, 0, scrollFrame.size.height);

lastView.frame=CGRectOffset(lastView.frame, 0, 2*scrollFrame.size.height);

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

}

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

{

preView.frame=CGRectOffset(preView.frame, 0, 0);

curView.frame=CGRectOffset(curView.frame, scrollFrame.size.width, 0);

lastView.frame=CGRectOffset(lastView.frame, scrollFrame.size.width*2, 0);

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

}

}

- (NSArray*) getDisplayImagesWithCurpage:(int)page

{

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

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

if([curImages count]!=0) [curImages removeAllObjects];

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

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

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

return curImages;

}

- (int)validPageValue:(NSInteger)value

{

if(value==0) value=totalPage; //value=1为第一张,value=0为前面一张

if(value==totalPage+1) value=1;

return value;

}

- (void) scrollViewDidScroll:(UIScrollView *)crollView

{

int x=crollView.contentOffset.x;

int y=crollView.contentOffset.y;

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

{

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

{

curPage=[self validPageValue:curPage+1];

[self refreshScrollView];

}

if(x<=0)

{

curPage=[self validPageValue:curPage-1];

[self refreshScrollView];

}

}

//竖直滚动

if(scrollDirection==PortaitDirection)

{

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

{

curPage=[self validPageValue:curPage+1];

[self refreshScrollView];

}

}

}

- (void)dealloc

{

[imagesArray release];

[curImages release];

[super dealloc];

}

@end
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: