Grid里面使用的循环翻页的自定义组件

来源:互联网 发布:mac口红whirl试色 编辑:程序博客网 时间:2024/05/19 18:17


一、头文件

//

//  NQScorllPage.h

//  IpadBlackDemo

//

//  Created by ch_soft on 11-11-17.

//  Copyright 2011 __MyCompanyName__. All rights reserved.

//


#import<UIKit/UIKit.h>

#import"NQScorllPageChildView.h"


@protocolNQScorllPageDelegate;


@interface NQScorllPage :UIView<UIScrollViewDelegate>

{

   NQScorllPageChildView * last;//上一个

   NQScorllPageChildView * current;//当前的

   NQScorllPageChildView * next;//下一个

    

    UIScrollView * pageControl;//翻页控制器

    

    NSInteger pageNumber;//当前显示页

}


@property(nonatomic,assign)id<NQScorllPageDelegate> delegate;

@property(nonatomic,retain)UIScrollView * pageControl;//翻页控制器

@property(nonatomic,assign)NSInteger pageNumber;      //当前显示页

@property(nonatomic,retain)NQScorllPageChildView * last;

@property(nonatomic,retain)NQScorllPageChildView * current;

@property(nonatomic,retain)NQScorllPageChildView * next;


@property(nonatomic,retain)NSMutableArray * subScorllPages;//同步的子视图

@property(nonatomic,assign)BOOL isVertical;//是否垂直

@property(nonatomic,assign)BOOL isSynchronization;        //是否启动同步

@property(nonatomic,assign)BOOL scrollPageEnabled;        //是否可以滑动,默认不可以滑动

@property(nonatomic,assign)BOOL paddingPageEnabled;       //是否适应页

@property(nonatomic,assign)NSInteger pageMax;  


-(void)scrollToNextPage;//下一页

-(void)scrollToLastPage;//上一页


@end


@protocol NQScorllPageDelegate <NSObject>


@optional

//滑动超过一半时触发

-(void)excessHalfPageSCorllPage:(NQScorllPage*) scorllPage pageNumber:(NSNumber *) pagenumber;

//开始滑动时执行

-(void)scrollViewMove:(NQScorllPage*) scorllPage pageNumber:(NSNumber*) pagenumber;

//完成滑动后执行

-(void)scrollViewDidEnd:(NQScorllPage*) scorllPage pageNumber:(NSNumber*) pagenumber;

//滚动到下一页时执行

-(void)scrollViewNextPage:(NQScorllPage *) scorllPage pageNumber:(NSNumber *)pagenumber;

//滚动到上一页时执行

-(void)scrollViewLastPage:(NQScorllPage *) scorllPage pageNumber:(NSNumber *)pagenumber;


@end




二、源文件

//

//  NQScorllPage.m

//  IpadBlackDemo

//

//  Created by ch_soft on 11-11-17.

//  Copyright 2011 __MyCompanyName__. All rights reserved.

//


#import"NQScorllPage.h"


@implementation NQScorllPage


@synthesize isVertical;

@synthesize delegate,pageControl,pageNumber,scrollPageEnabled,paddingPageEnabled,pageMax;

@synthesize last,next,current;

@synthesize subScorllPages,isSynchronization;


-(void)initScorllPage

{

   //垂直的情况

   if (isVertical) {

       pageControl.contentSize=CGSizeMake(pageControl.frame.size.width,10*pageControl.frame.size.height);

        

        if (current==nil) {

           current=[[NQScorllPageChildViewalloc]initWithFrame:pageControl.frame];

        }

        

       CGRect lastFrame=CGRectMake(current.frame.origin.x,current.frame.origin.y-current.frame.size.height,current.frame.size.width,current.frame.size.height);

        

       CGRect nextFrame=CGRectMake(current.frame.origin.x,current.frame.origin.y+current.frame.size.height,current.frame.size.width,current.frame.size.height);

        

        if (last==nil) {

            last=[[NQScorllPageChildView alloc] initWithFrame:lastFrame];

        }

        if (next==nil) {

            next=[[NQScorllPageChildView alloc] initWithFrame:nextFrame];

        }        

        

    }else//水平的情况

    {

       pageControl.contentSize=CGSizeMake(10*pageControl.frame.size.width,pageControl.frame.size.height);

        

        if (current==nil) {

           current=[[NQScorllPageChildViewalloc]initWithFrame:pageControl.frame];

        }

        

       CGRect lastFrame=CGRectMake(current.frame.origin.x-current.frame.size.width,current.frame.origin.y,current.frame.size.width,current.frame.size.height);

        

       CGRect nextFrame=CGRectMake(current.frame.origin.x+current.frame.size.width,current.frame.origin.y,current.frame.size.width,current.frame.size.height);

        

        if (last==nil) {

            last=[[NQScorllPageChildView alloc] initWithFrame:lastFrame];

        }

        if (next==nil) {

            next=[[NQScorllPageChildView alloc] initWithFrame:nextFrame];

        }    

    }

}

- (id)initWithFrame:(CGRect)frame

{

    self = [super initWithFrame:frame];

    if (self) {

        isVertical=YES;

       scrollPageEnabled=NO;

       paddingPageEnabled=YES;

        pageControl =[[UIScrollView alloc] initWithFrame:CGRectMake(0,0, frame.size.width, frame.size.height)];//得到控制的scorllview

//        pageControl.showsHorizontalScrollIndicator=NO;

//        pageControl.showsVerticalScrollIndicator=NO;

       pageControl.pagingEnabled=paddingPageEnabled;

        pageControl.delegate=self;

       pageControl.showsHorizontalScrollIndicator=YES;

       pageControl.scrollEnabled=scrollPageEnabled;

        

        [selfinitScorllPage];

   

        [selfaddSubview:pageControl];

        [pageControladdSubview:last];

        [pageControladdSubview:current];

        [pageControladdSubview:next];

   

    }

   returnself;

}


- (void)dealloc {

    [pageControlrelease];

    [nextrelease];

    [lastrelease];

    [superdealloc];

}



#pragma mark

#pragma mark UIScrollViewdelegate

- (void)scrollViewDidScroll:(UIScrollView *)scrollView;  

{

    CGFloat pageHeight = self.frame.size.height;

   CGFloat pageWidth=self.frame.size.width;

    

    if (delegate!=nil&&[delegaterespondsToSelector:@selector(scrollViewMove:pageNumber:)]) {

        [delegateperformSelector:@selector(scrollViewMove:pageNumber:)withObject:selfwithObject:[NSNumbernumberWithInt:pageNumber]];

    }


   /****************************************垂直的情况 ******************************************/

   if (isVertical) {

        //判段是否同步

       if (isSynchronization&&[subScorllPagescount]>0) {

           //相对子scorllpage的偏移量

            for (int i=0; i<[subScorllPagescount]; i++) {

                NQScorllPage * temp=[subScorllPages objectAtIndex:i];

                CGPoint offset;

                offset.x =0;

                offset.y =floor(temp.frame.size.height/pageControl.frame.size.height*pageControl.contentOffset.y);

                [temp.pageControlsetContentOffset:offsetanimated:NO];

            }

        }

        

        NQScorllPageChildView *tempChildView= nil;

        int page = floor((pageControl.contentOffset.y + pageHeight /2) / pageHeight);

        

        if (pageNumber == page||abs(page-pageNumber)>1) { 

            

            return;

            

        }elseif (pageNumber +1 == page) {//  页面向上滑动了一页

            

            tempChildView =current;//这里只换顺序,不改变位置.

            current=next;

            next=last;

            last=tempChildView;

            pageNumber = page;

            

            if (delegate!=nil&&[delegaterespondsToSelector:@selector(scrollViewNextPage:pageNumber:)]) {

                [delegateperformSelector:@selector(scrollViewNextPage:pageNumber:)withObject:selfwithObject:[NSNumbernumberWithInt:pageNumber]];

            }


            

        }elseif (pageNumber -1 == page) {//  页面向下滑动了一页

            

            tempChildView =current;

            current=last;

            last=next;

            next=tempChildView;

            pageNumber = page;

            

            if (delegate!=nil&&[delegaterespondsToSelector:@selector(scrollViewLastPage:pageNumber:)]) {

                [delegateperformSelector:@selector(scrollViewLastPage:pageNumber:)withObject:selfwithObject:[NSNumbernumberWithInt:pageNumber]];

            }


            

        }

        

       //对三个视图重新定位

        current.frame = CGRectMake( 0,pageNumber* pageHeight,pageControl.frame.size.width,pageControl.frame.size.height);

        last.frame = CGRectMake( 0,(pageNumber -1)* pageHeight,pageControl.frame.size.width,pageControl.frame.size.height);

        next.frame = CGRectMake( 0,(pageNumber +1)* pageHeight,pageControl.frame.size.width,pageControl.frame.size.height);


    }else

    {

   /****************************************水平的情况 ******************************************/


        

        //判段是否同步

       if (isSynchronization&&[subScorllPagescount]>0) {

           //相对子scorllpage的偏移量

            for (int i=0; i<[subScorllPagescount]; i++) {

                NQScorllPage * temp=[subScorllPages objectAtIndex:i];

                CGPoint offset;

                offset.x =floor(temp.frame.size.width/pageControl.frame.size.width*pageControl.contentOffset.x);

                offset.y =0;

                [temp.pageControlsetContentOffset:offsetanimated:NO];

            }

        }

   

        NQScorllPageChildView *tempChildView= nil;

        int page = floor((pageControl.contentOffset.x + pageWidth /2) / pageWidth);

        

        if (pageNumber == page||abs(page-pageNumber)>1) { 

            return;

        }elseif (pageNumber +1 == page) {//  页面向上滑动了一页

            

            tempChildView =current;//这里只换顺序,不改变位置.

            current=next;

            next=last;

            last=tempChildView;

            

            pageNumber = page;

            if (delegate!=nil&&[delegaterespondsToSelector:@selector(scrollViewNextPage:pageNumber:)]) {

                [delegateperformSelector:@selector(scrollViewNextPage:pageNumber:)withObject:selfwithObject:[NSNumbernumberWithInt:pageNumber]];

            }

            

        }elseif (pageNumber -1 == page) {//  页面向下滑动了一页

            

            tempChildView =current;

            current=last;

            last=next;

            next=tempChildView;

            

            pageNumber = page;

            

            if (delegate!=nil&&[delegaterespondsToSelector:@selector(scrollViewLastPage:pageNumber:)]) {

                [delegateperformSelector:@selector(scrollViewLastPage:pageNumber:)withObject:selfwithObject:[NSNumbernumberWithInt:pageNumber]];

            }

            

        }

        

       //对三个视图重新定位

       current.frame =CGRectMake(pageNumber* pageWidth,0,pageControl.frame.size.width,pageControl.frame.size.height);

        last.frame = CGRectMake( (pageNumber - 1)* pageWidth,0, pageControl.frame.size.width,pageControl.frame.size.height);

        next.frame = CGRectMake( (pageNumber + 1)* pageWidth,0, pageControl.frame.size.width,pageControl.frame.size.height);


    }

 

    if (delegate!=nil&&[delegaterespondsToSelector:@selector(excessHalfPageSCorllPage:pageNumber:)]) {

        [delegateperformSelector:@selector(excessHalfPageSCorllPage:pageNumber:)withObject:selfwithObject:[NSNumbernumberWithInt:pageNumber]];

    }


        



}

//开始拖动

- (void)scrollViewWillBeginDragging:(UIScrollView *)scrollView; {

    

}

//完成拖动

- (void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate; 

{


    

}

//开始减速

- (void)scrollViewWillBeginDecelerating:(UIScrollView *)scrollView;  

{


}

//完成减速

- (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView;     

{

    if (pageMax==0) {

        if (isVertical) {

           pageControl.contentSize=CGSizeMake(pageControl.frame.size.width, (pageNumber+15)*pageControl.frame.size.height);

        }else

        {

           pageControl.contentSize=CGSizeMake((pageNumber+15)*pageControl.frame.size.width,pageControl.frame.size.height);

        }

    }

    

   //判段是否同步

   if (isSynchronization&&[subScorllPagescount]>0) {

        

        for (int i=0; i<[subScorllPagescount]; i++) {

            NQScorllPage * temp=[subScorllPages objectAtIndex:i];

            temp.pageNumber=pageNumber;

        }

        

    }


    

    if (delegate!=nil&&[delegaterespondsToSelector:@selector(scrollViewDidEnd:pageNumber:)]) {

        [delegateperformSelector:@selector(scrollViewDidEnd:pageNumber:)withObject:selfwithObject:[NSNumbernumberWithInt:pageNumber]];

    }


}


-(void)scrollViewDidEndScrollingAnimation:(UIScrollView *)scrollView

{

    if (pageMax==0) {

        if (isVertical) {

           pageControl.contentSize=CGSizeMake(pageControl.frame.size.width, (pageNumber+15)*pageControl.frame.size.height);

        }else

        {

           pageControl.contentSize=CGSizeMake((pageNumber+15)*pageControl.frame.size.width,pageControl.frame.size.height);

        }

    }

    

   //判段是否同步

   if (isSynchronization&&[subScorllPagescount]>0) {

        

        for (int i=0; i<[subScorllPagescount]; i++) {

            NQScorllPage * temp=[subScorllPages objectAtIndex:i];

            temp.pageNumber=pageNumber;

        }

        

    }

    

    

    if (delegate!=nil&&[delegaterespondsToSelector:@selector(scrollViewDidEnd:pageNumber:)]) {

        [delegateperformSelector:@selector(scrollViewDidEnd:pageNumber:)withObject:selfwithObject:[NSNumbernumberWithInt:pageNumber]];

    }


}



#pragma mark

#pragma mark custom method

-(void)scrollToNextPage;

{

    

//    if (isVertical) {

//        pageMax=newPageMax;

//        pageControl.contentSize=CGSizeMake(pageControl.frame.size.width, (pageMax)* pageControl.frame.size.height);

//    }else{

//        pageControl.contentSize=CGSizeMake((pageMax)*pageControl.frame.size.width,  pageControl.frame.size.height);

//    }


    if (pageMax==0) {

        if (isVertical) {

            CGPoint offset;

            offset.x =0;

            offset.y = (pageNumber+1)*pageControl.frame.size.height;

            [pageControlsetContentOffset:offsetanimated:YES];

        }else

        {

            CGPoint offset;

            offset.x = (pageNumber+1)*pageControl.frame.size.width;

            offset.y =0;

            [pageControlsetContentOffset:offsetanimated:YES];

        }

    }else

    {

        if (isVertical) {

            CGPoint offset;

            offset.x =0;

            offset.y = (pageNumber+1)*pageControl.frame.size.height;

            NSLog(@"1111 is %f,2222 is %f",offset.y+pageControl.frame.size.width,(pageMax)*pageControl.frame.size.height);

            if (offset.y+pageControl.frame.size.height> (pageMax)*pageControl.frame.size.height) {

                return;

            }

            [pageControlsetContentOffset:offsetanimated:YES];

        }else

        {

            CGPoint offset;

            offset.x = (pageNumber+1)*pageControl.frame.size.width;

            offset.y =0;

            

            if (offset.x> (pageMax)*pageControl.frame.size.height) {

                return;

            }

            [pageControlsetContentOffset:offsetanimated:YES];

        }


    }

       

}

-(void)scrollToLastPage;

{

    if (pageNumber-1<0) {

        return;

    }

   if (isVertical) {

        CGPoint offset;

        offset.x =0;

        offset.y = (pageNumber-1)*pageControl.frame.size.height;

        [pageControlsetContentOffset:offsetanimated:YES];

    }else

    {

        CGPoint offset;

        offset.x = (pageNumber-1)*pageControl.frame.size.width;

        offset.y =0;

        [pageControlsetContentOffset:offsetanimated:YES];

    }

   

}


#pragma mark

#pragma mark get/set method

//get/set method

-(void)setScrollPageEnabled:(BOOL) newscrollPageEnabled

{

    scrollPageEnabled=newscrollPageEnabled;

   pageControl.scrollEnabled=scrollPageEnabled;

}


-(void)setPaddingPageEnabled:(BOOL)newpaddingPageEnabled

{

    paddingPageEnabled=newpaddingPageEnabled;

   pageControl.pagingEnabled=paddingPageEnabled;

}


-(void)setIsVertical:(BOOL)newisVertical

{

    isVertical=newisVertical;

    [selfinitScorllPage];

}

-(void)setLast:(NQScorllPageChildView *)newlast

{

    CGRect lastframe=last.frame;

    if (newlast!=last) {

        [lastrelease];

        newlast.frame=lastframe;

        last=[newlast retain];

        [pageControladdSubview:last];

    }

}


-(void)setCurrent:(NQScorllPageChildView *)newcurrent

{

    CGRect currentframe=current.frame;

    if (newcurrent!=current) {

        [currentrelease];

        newcurrent.frame=currentframe;

        current=[newcurrent retain];

        [pageControladdSubview:current];

    }

    

}


-(void)setNext:(NQScorllPageChildView *)newnext

{

    CGRect nextframe=next.frame;

    if (newnext!=next) {

        [nextrelease];

        newnext.frame=nextframe;

        next=[newnext retain];

        [pageControladdSubview:next];

    }

    

}



-(void)setPageNumber:(NSInteger)newPageNumber

{

    pageNumber=newPageNumber;

    

    CGFloat pageHeight = self.frame.size.height;

   CGFloat pageWidth=self.frame.size.width;

    

   if (isVertical) {

       pageControl.contentSize=CGSizeMake(pageControl.frame.size.width, (pageNumber+10)*pageControl.frame.size.height);

        

        [pageControlsetContentOffset:CGPointMake(0,pageNumber*pageHeight)animated:NO];

       //对三个视图重新定位

        current.frame = CGRectMake( 0,pageNumber* pageHeight,pageControl.frame.size.width,pageControl.frame.size.height);

        last.frame = CGRectMake( 0,(pageNumber -1)* pageHeight,pageControl.frame.size.width,pageControl.frame.size.height);

        next.frame = CGRectMake( 0,(pageNumber +1)* pageHeight,pageControl.frame.size.width,pageControl.frame.size.height);

    }else

    {

       pageControl.contentSize=CGSizeMake((pageNumber+10)*pageControl.frame.size.width,pageControl.frame.size.height);

        

        [pageControlsetContentOffset:CGPointMake(pageNumber*pageWidth,0)animated:NO];

       current.frame =CGRectMake(pageNumber* pageWidth,0,pageControl.frame.size.width,pageControl.frame.size.height);

        last.frame = CGRectMake( (pageNumber - 1)* pageWidth,0, pageControl.frame.size.width,pageControl.frame.size.height);

        next.frame = CGRectMake( (pageNumber + 1)* pageWidth,0, pageControl.frame.size.width,pageControl.frame.size.height);

    }

    

}



-(void)setPageMax:(NSInteger)newPageMax

{

   if (isVertical) {

        pageMax=newPageMax;

       pageControl.contentSize=CGSizeMake(pageControl.frame.size.width, (pageMax)* pageControl.frame.size.height);

    }else{

       pageControl.contentSize=CGSizeMake((pageMax)*pageControl.frame.size.widthpageControl.frame.size.height);

    }

}


    


@end


三、每页的子类

//

//  NQScorllPageChildView.h

//  IpadBlackDemo

//

//  Created by ch_soft on 11-11-17.

//  Copyright 2011 __MyCompanyName__. All rights reserved.

//


#import<UIKit/UIKit.h>


@interface NQScorllPageChildView :UIView


@end






//

//  NQScorllPageChildView.m

//  IpadBlackDemo

//

//  Created by ch_soft on 11-11-17.

//  Copyright 2011 __MyCompanyName__. All rights reserved.

//


#import"NQScorllPageChildView.h"


@implementation NQScorllPageChildView


- (id)initWithFrame:(CGRect)frame

{

    self = [super initWithFrame:frame];

    if (self) {

       // Initialization code

    }

   returnself;

}


/*

- (void)drawRect:(CGRect)rect

{

    // Drawing code

}

*/


@end






原创粉丝点击