首页 > 代码库 > 继承UIView实现的简单UIScrollView

继承UIView实现的简单UIScrollView

#import<UIKit/UIKit.h>


@interface ScrollView :UIView

{

    UIView *contentView;

    CGSize contentSize;

    CGPoint contentOffset;

    CGRect contentFrame;

    

    

    BOOL scrollEnabled;

    BOOL pagingEnabled;


    float totalPage;

    float curPage;

    

    NSTimeInterval beginTime;

   NSTimeInterval endTime;

    

    CGPoint touchBeginLocation;

    CGPoint touchMoveLocation;

    CGPoint touchEndLocation;

}


@property (nonatomic,assign) CGSize contentSize;

@property (nonatomic,assign) CGPoint contentOffset;

@property (nonatomic,assign) BOOL pagingEnabled;

@property (nonatomic,assign) BOOL scrollEnabled;


@end



//

#import"ScrollView.h"

@interfaceScrollView()


- (void) setFrameOfContentViewWithPage:(float)page;

- (float) getValidPage:(float)page;

@end




@implementation ScrollView

@synthesize contentSize,contentOffset;

@synthesize scrollEnabled,pagingEnabled;


staticCGPoint beginOffset;

constfloat percent=0.4;   //用来表示拖动百分比可以造成翻页或者边界反弹

- (id)initWithFrame:(CGRect)frame

{

    self = [super initWithFrame:frame];

    if (self

    {

       scrollEnabled=YES//是否可以滚动

        pagingEnabled=NO;   //是否可以翻页

       contentOffset=CGPointZero//contentview原点距离self原点距离,这儿取的负值

       contentSize=frame.size;    //存放图片有效范围frame是(0,0,contentsize.width,contentsize.height

        contentFrame=frame;         //selfframe

        totalPage=1;            //总的页数

        curPage=1;

        

        contentView=[[UIView alloc] initWithFrame:CGRectMake(contentOffset.x,contentOffset.y, frame.size.width, frame.size.height)];

        [superaddSubview:contentView];

        [contentViewrelease];

    }

   return self;

}


- (void) setContentSize:(CGSize)_contentSize   //最多存储图片大小

{

    contentSize=_contentSize;

   contentView.frame=CGRectMake(0,0, contentSize.width,contentSize.height);

   totalPage=contentSize.width/contentFrame.size.width;

}


- (void) addSubview:(UIView *)view

{

    [contentViewaddSubview:view];

}


- (void) touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event

{

    UITouch *touch=[touches anyObject];

   touchBeginLocation=[touch locationInView:self];

    beginTime=[touch timestamp];

   beginOffset=contentOffset;

}


- (void) touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event

{

    UITouch *touch=[touches anyObject];

   touchMoveLocation=[touch locationInView:self];

   float offsetX=touchMoveLocation.x-touchBeginLocation.x;

   float offsetY=touchMoveLocation.y-touchBeginLocation.y;

    if(self.frame.size.width>=contentSize.width)    offsetX=0.0;    //表示在水平方向不可以移动

    if(self.frame.size.height>=contentSize.height)  offsetY=0.0;    //表示竖直方向不可以移动

   contentOffset=CGPointMake(beginOffset.x+offsetX,beginOffset.y+offsetY);

    

   if(contentOffset.x>=contentFrame.size.width*percent || contentOffset.x<=-(contentSize.width*(totalPage-1)+contentFrame.size.width*percent))    //滚动到边缘

    {

       if(contentOffset.x>0)   curPage=1.0;

       if(contentOffset.x<0)   curPage=totalPage;

        [selfsetFrameOfContentViewWithPage:curPage];

    }

    

   contentView.frame=CGRectMake(contentOffset.x,contentOffset.y,contentSize.width,contentSize.height);

}


- (void) touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event

{

    UITouch *touch=[touches anyObject];

    endTime=[touch timestamp];

   touchEndLocation=[touch locationInView:self];

   if(contentOffset.x>0 || contentOffset.x<-contentFrame.size.width*(totalPage-1))//滚动到边缘

    {

       if(contentOffset.x>0)   curPage=1.0;

       if(contentOffset.x<0)   curPage=totalPage;

        [selfsetFrameOfContentViewWithPage:curPage];

    }

    

    float pastTime=endTime-beginTime;

   float offsetX=touchEndLocation.x-touchBeginLocation.x;

   if(pagingEnabled)  //可以翻页

    {

        if(pastTime<=0.3)

        {

            if(offsetX>0.1 || offsetX<-0.1)    //表示发生了移动

            {

                if(offsetX>0.1) curPage=[self getValidPage:curPage-1]; //向右移动,向前翻页

                if(offsetX<-0.1)    curPage=[self getValidPage:curPage+1]; //向左移动,向后翻页

            }

        }

        else

        {

            if(offsetX>=self.frame.size.width*percent || offsetX<=-self.frame.size.width*percent)   

            {

                if(offsetX>0)   curPage=[self getValidPage:curPage-1];

                if(offsetX<0)   curPage=[self getValidPage:curPage+1];

            }

        }

        [selfsetFrameOfContentViewWithPage:curPage];

    }

}


- (void) touchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event

{

   

}


- (float) getValidPage:(float)page

{

    NSLog(@"%f",page);

    curPage=page;

    if(page<1curPage=1;

   if(page>totalPagecurPage=totalPage;

   if(page==totalPage-1)  curPage=(int)totalPage;

   return curPage;

}


- (void) setFrameOfContentViewWithPage:(float)page

{

    curPage=page;

    [UIViewbeginAnimations:nilcontext:nil];

    [UIViewsetAnimationCurve:UIViewAnimationCurveEaseInOut];

    [UIViewsetAnimationDuration:0.2];

   contentOffset=CGPointMake(-(page-1)*contentFrame.size.width,0);

   contentView.frame=CGRectMake(contentOffset.x,contentOffset.y,contentSize.width,contentSize.height);

    [UIViewcommitAnimations];

}



@end