首页 > 代码库 > 继承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; //self的frame
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<1) curPage=1;
if(page>totalPage) curPage=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