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


一、头文件

//

//  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];

   

    }

   return self;

}


- (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:offset animated: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:offset animated: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:offset animated:YES];

        }else

        {

            CGPoint offset;

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

            offset.y =0;

            [pageControlsetContentOffset:offset animated: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:offset animated: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:offset animated:YES];

        }


    }

       

}

-(void)scrollToLastPage;

{

    if (pageNumber-1<0) {

        return;

    }

   if (isVertical) {

        CGPoint offset;

        offset.x =0;

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

        [pageControlsetContentOffset:offset animated:YES];

    }else

    {

        CGPoint offset;

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

        offset.y =0;

        [pageControlsetContentOffset:offset animated: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

    }

   return self;

}


/*

- (void)drawRect:(CGRect)rect

{

    // Drawing code

}

*/


@end






1 之前上传了dhtmlx的官方demo上去 都很久了 (http: download csdn net detail pxzsky 2946815)看大家最近有需求 希望得到实际的使用代码 因为组件很多 所以我觉得大家可能对一些核心组件还是很感兴趣的 特别是分页列表 树等 这个在项目测试中我都用过了 这次先把列表的拿出来 2 因为涉及版权问题 如果你的产品要开源或者花钱购买授权 都没问题 否则最好还是仅仅内网学习使用 否 则需要考虑后果的 目前dhmtl只有GPL协议和商业协议 3 在我的其他资源中也有关于列表和树的组件使用示例: http: download csdn net detail pxzsky 6659071 这个工程是免费的(也可以认为开源) 里面使用了dhtml tree grid 很多地方用了tree 而grid目前只剩下角色管理列表了 后续也不想再用grid了 你可以参考 如果不想麻烦 那么就接着往下看 4 在它的免费版中(就是可以开源的) 最早(2 5)是没有分页库的 只有商业版有 后来经过高人指点 得到了crack 带有分页js库 很好用 其实主要是知道js中要传递的分页参数名字就ok了 5 资源包中有具体使用代码和组件的整个js 前端使用jsp 你只需要看分页那部分即可 其他的传的变量可以不管 以下粘贴重要的ui代码调用: <script type "text javascript"> var currpage <% request getParameter "cntPage" %>; 记录当前页面 $ document ready function { 初始化列表 initGrid ; } ; window dhx globalImgPath "${ctx} images public "; 初始化列表 function initGrid { showSkyLoading "数据加载中 请稍候 " ; mygrid new dhtmlXGridObject "projectlist" ; mygrid setImagePath " script dhtml grid imgs " ; mygrid setHeader "客户 项目 状态 是否ZZ 审核 提交时间 提交人 编辑 删除" ; mygrid setInitWidths " 180 90 50 70 90 70 50 50" ; mygrid setColAlign "left left left center left left left left left" ; mygrid setColTypes "ro ro ro ro ro ro ro ro ro" ; mygrid enableAutoHeight true "460" ; mygrid init ; mygrid setSkin "gray" ; mygrid enablePaging true ${splitPageSize} 5 "pagingArea" true "recinfoArea" ; mygrid loadXML "${ctx} project getProjectList action userScope " + ${userScope} ajustDms "xml" ; } function ajustDms { hideSkyLoading ; ajustFrameDms ; if currpage null && currpage "" && currpage "null" { mygrid changePage currpage ; } } < script> 后台接收分页参数: int iposStart 0; String posStart this getParameter "posStart" ; 相当于request getParameter "posStart" ; if posStart null && posStart equals "" { iposStart Integer parseInt posStart ; } int splitPageSize PreferenceUtil getSplitPageSize ; 当前列表分页条数配置(pageSize) 默认15条 SplitPageInfo spi new SplitPageInfo ; spi setPageSize splitPageSize ; 设置当前页信息 int currentPage 0; currentPage iposStart splitPageSize + 1; spi setCurrentPage currentPage ; 因为这个版本已经很老了 所以在IE10或其他新浏览器中会有些变形 如果用新版本 这个分页库能不能继续使用只有自己再尝试了 希望这个对大家有用 ">1 之前上传了dhtmlx的官方demo上去 都很久了 (http: download csdn net detail pxzsky 2946815)看大家最近有需求 希望得到实际的使用代码 因为组件很多 所以我觉得大家可能对一些核心组件还是很感兴趣的 特别是分页列表 树等 [更多]
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值