UIScrollView

来源:互联网 发布:射频开关矩阵 编辑:程序博客网 时间:2024/06/02 07:08

http://jungegeaipiaoyi.blog.163.com/blog/static/1730837892011827114831120/

#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 (nonatomicassignCGSize contentSize;

@property (nonatomicassignCGPoint contentOffset;

@property (nonatomicassignBOOL pagingEnabled;

@property (nonatomicassignBOOL scrollEnabled;


@end



//

#import "ScrollView.h"

@interface ScrollView()


- (void) setFrameOfContentViewWithPage:(float)page;

- (float) getValidPage:(float)page;

@end




@implementation ScrollView

@synthesize contentSize,contentOffset;

@synthesize scrollEnabled,pagingEnabled;


static CGPoint beginOffset;

const float 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 allocinitWithFrame:CGRectMake(contentOffset.xcontentOffset.y, frame.size.width, frame.size.height)];

        [super addSubview:contentView];

        [contentView release];

    }

    return self;

}


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

{

    contentSize=_contentSize;

    contentView.frame=CGRectMake(00contentSize.widthcontentSize.height);

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

}


- (void) addSubview:(UIView *)view

{

    [contentView addSubview: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;

        [self setFrameOfContentViewWithPage:curPage];

    }

    

    contentView.frame=CGRectMake(contentOffset.xcontentOffset.ycontentSize.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;

        [self setFrameOfContentViewWithPage: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.1curPage=[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];

            }

        }

        [self setFrameOfContentViewWithPage:curPage];

    }

}


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

{

    NSLog(@"touch cancel");

}


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

    [UIView beginAnimations:nil context:nil];

    [UIView setAnimationCurve:UIViewAnimationCurveEaseInOut];

    [UIView setAnimationDuration:0.2];

    contentOffset=CGPointMake(-(page-1)*contentFrame.size.width0);

    contentView.frame=CGRectMake(contentOffset.xcontentOffset.ycontentSize.width,contentSize.height);

    [UIView commitAnimations];

}



@end


0 0