///
.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; //value=1为第一张,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