交叉表组件

#import <Foundation/Foundation.h>

#define kRED  @"1"

#define kBLACK  @"0"

#define kGREEN  @"2"

/**

 * DataGrid所用数据源对象

 */

@interface DataGridComponentDataSource : NSObject

{

/**

* 标题列表

*/

NSMutableArray *titles;

/**

* 数据体,其中包函其它列表(NSArray)

*/

NSMutableArray *data;

/**

* 列宽

*/

NSMutableArray *columnWidth;

    

  

    

}

@property(retain) NSMutableArray *titles;

@property(retain) NSMutableArray *data;

@property(retain) NSMutableArray *columnWidth;

@end

@interface DataGridScrollView : UIScrollView

{

id dataGridComponent;

}

@property(assign)id dataGridComponent;

@end

/**

 * 数据列表组件,支持上下与左右滑动

 */

@interface DataGridComponent : UIView<UIScrollViewDelegate> {

//左下列视图

DataGridScrollView *vLeft;

//右下列视图

DataGridScrollView *vRight;

//右下列表内容

UIView *vRightContent;

//左下列表内容

UIView *vLeftContent;

//右上标题

UIView *vTopRight;

//左上标题

UIView *vTopLeft;

//列表数据源

DataGridComponentDataSource *dataSource;

//内容总高度

float contentHeight ;

//内容总宽度

float contentWidth;

//单元格默认高度

float cellHeight;

//单元格默认宽度

float cellWidth;

}

@property(readonly) DataGridScrollView *vRight;

@property(readonly) DataGridScrollView *vLeft;

@property(readonly) float cellHeight;

@property(retain) DataGridComponentDataSource *dataSource;

/**

 * 用指定显示区域与数据源初始化对象

 */

- (id)initWithFrame:(CGRect)aRect data:(DataGridComponentDataSource*)aDataSource;

@end

  .m

#import "DataGridComponent.h"

@implementation DataGridScrollView

@synthesize dataGridComponent;

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

UITouch *t = [touches anyObject];

if([t tapCount] == 1){

DataGridComponent *d = (DataGridComponent*)dataGridComponent;

int idx = [t locationInView:self].y / d.cellHeight;

[UIViewbeginAnimations:nilcontext:nil];

[UIViewsetAnimationDuration:0.65];

for(int i=0;i<[d.dataSource.titles count];i++){

UILabel *l = (UILabel*)[dataGridComponent viewWithTag:idx * d.cellHeight + i + 1000];

l.alpha = .5;

}

for(int i=0;i<[d.dataSource.titles count];i++){

UILabel *l = (UILabel*)[dataGridComponent viewWithTag:idx * d.cellHeight + i + 1000];

l.alpha = 1.0;

}

[UIViewcommitAnimations];

}

}

@end

@implementation DataGridComponentDataSource

@synthesize titles,data,columnWidth;

- (void) dealloc

{

    [data release];

    [titles release];

    [columnWidthrelease];

  

[superdealloc];

}

@end

//声明私有方法

@interface DataGridComponent(Private)

/**

 * 初始化各子视图

 */

-(void)layoutSubView:(CGRect)aRect;

/**

 * 用数据项填冲数据

 */

-(void)fillData;

@end

@implementation DataGridComponent

@synthesize dataSource,cellHeight,vRight,vLeft;

- (id)initWithFrame:(CGRect)aRect data:(DataGridComponentDataSource*)aDataSource{

self = [super initWithFrame:aRect];

if(self != nil){

        

self.clipsToBounds = YES;

//self.backgroundColor = [UIColor blackColor];

        self.backgroundColor = [UIColor colorWithRed:71.0/255 green:71.0/255 blue:71.0/255 alpha:1];

self.dataSource = aDataSource;

        

//初始显示视图及Cell的长宽高

contentWidth = .0;

cellHeight = 40.0;

        cellWidth = [[dataSource.columnWidthobjectAtIndex:0] intValue];

for(int i=1;i<[dataSource.columnWidthcount];i++)

contentWidth += [[dataSource.columnWidthobjectAtIndex:i] intValue];

contentHeight = [dataSource.datacount] * cellHeight;

contentWidth = contentWidth + [[dataSource.columnWidthobjectAtIndex:0] intValue]  < aRect.size.width 

        ? aRect.size.width : contentWidth;

        

//初始化各视图

[selflayoutSubView:aRect];

//填冲数据

[selffillData];

        

}

returnself;

}

-(void)layoutSubView:(CGRect)aRect{

vLeftContent = [[UIViewalloc] initWithFrame:CGRectMake(0, 0, 60, contentHeight)];

vRightContent = [[UIViewalloc] initWithFrame:CGRectMake(0, 0, aRect.size.width - cellWidth, contentHeight)];

vLeftContent.opaque = YES;

vRightContent.opaque = YES;

//初始化各视图

vTopLeft = [[UIViewalloc] initWithFrame:CGRectMake(0, 0, cellWidth, cellHeight+2)];

vLeft = [[DataGridScrollViewalloc] initWithFrame:CGRectMake(0, cellHeight+2, aRect.size.width, aRect.size.height - cellHeight-2)];

vRight = [[DataGridScrollViewalloc] initWithFrame:CGRectMake(cellWidth, 0, aRect.size.width - cellWidth, contentHeight)];

vTopRight = [[UIViewalloc] initWithFrame:CGRectMake(cellWidth, 0, aRect.size.width - cellWidth, cellHeight+2)];

vLeft.dataGridComponent = self;

vRight.dataGridComponent = self;

vLeft.opaque = YES;

vRight.opaque = YES;

vTopLeft.opaque = YES;

vTopRight.opaque = YES;

//设置ScrollView的显示内容

vLeft.contentSize = CGSizeMake(aRect.size.width, contentHeight);

vRight.contentSize = CGSizeMake(contentWidth,aRect.size.height - cellHeight);

//设置ScrollView参数

vRight.delegate = self;

    vTopRight.backgroundColor=[UIColorcolorWithRed:71.0/255green:71.0/255blue:71.0/255alpha:1];

    vRight.backgroundColor=[UIColorcolorWithRed:71.0/255green:71.0/255blue:71.0/255alpha:1];

    vTopLeft.backgroundColor=[UIColorcolorWithRed:71.0/255green:71.0/255blue:71.0/255alpha:1];

    //vTopRight.backgroundColor = [UIColor blackColor];

//vRight.backgroundColor = [UIColor blackColor];

//vTopLeft.backgroundColor = [UIColor colorWithRed:.7 green:.7 blue:.7 alpha:1];

//添加各视图

[vRightaddSubview:vRightContent];

[vLeftaddSubview:vLeftContent];

[vLeftaddSubview:vRight];

[selfaddSubview:vTopLeft];

[selfaddSubview:vLeft];

[vLeftbringSubviewToFront:vRight];

[selfaddSubview:vTopRight];

[selfbringSubviewToFront:vTopRight];

}

-(void)fillData{

    

float columnOffset = 0.0;

    int iColorRed=0;

//填冲标题数据

for(int column = 0;column < [dataSource.titles count];column++){

float columnWidth = [[dataSource.columnWidth objectAtIndex:column] floatValue];

UILabel *l = [[UILabel alloc] initWithFrame:CGRectMake(columnOffset, 0, columnWidth -1, cellHeight+2 )];

l.font = [UIFontsystemFontOfSize:16.0f];

l.text = [dataSource.titles objectAtIndex:column];

//l.backgroundColor = [UIColor colorWithRed:0.0/255 green:105.0/255 blue:186.0/255 alpha:1];

        l.backgroundColor=[UIColorcolorWithPatternImage:[UIImageimageNamed:@"bgtopbg"]];

l.textColor = [UIColorwhiteColor];

        l.shadowColor = [UIColorblackColor];

        l.shadowOffset = CGSizeMake(0, -0.5);

l.textAlignment = UITextAlignmentCenter;

        

        if( 0 == column){

            [vTopLeft addSubview:l];

        }

        else{

            [vTopRight addSubview:l];

            columnOffset += columnWidth;

        }

        

[l release];

}

    

//填冲数据内容

for(int i = 0;i<[dataSource.data count];i++){

NSArray *rowData = [dataSource.data objectAtIndex:i];

columnOffset = 0.0;

for(int column=0;column<[rowData count];column++){

            //1个字段表示是否显示红色字体

            if(column==0)

            {  

                if([[rowData objectAtIndex:0] intValue] == 1)

                {

                    iColorRed=1;

                }

                else if([[rowData objectAtIndex:0] intValue] == 2)

                {

                    iColorRed=2;

                }

                else

                    iColorRed=0;

                    

            }

            else

            {

                float columnWidth = [[dataSource.columnWidth objectAtIndex:column-1] floatValue];;

                UILabel *l = [[UILabel alloc] initWithFrame:CGRectMake(columnOffset, i * cellHeight  , columnWidth-1, cellHeight -1 )];

                l.font = [UIFont systemFontOfSize:14.0f];

                l.text = [rowData objectAtIndex:column];

//                if(column==1)

//                { 

//                    l.textAlignment = UITextAlignmentLeft;

//                }

//                else {

//                    l.textAlignment = UITextAlignmentCenter;

//                }

                l.textAlignment = UITextAlignmentCenter;

                l.tag = i * cellHeight + column + 1000;

                if(i % 2 == 0)

                    l.backgroundColor = [UIColor colorWithRed:59.0/255 green:59.0/255 blue:59.0/255 alpha:1];

                else

                    l.backgroundColor = [UIColor colorWithRed:49.0/255 green:49.0/255 blue:49.0/255 alpha:1];

                

                

                if (iColorRed==1

                {

                    l.textColor=[UIColor redColor];

                }

                if (iColorRed==2

                {

                    l.textColor=[UIColor colorWithRed:0.0/255 green:180.0/255 blue:90.0/255 alpha:1];

                }

                if (iColorRed==0

                {

                    l.textColor=[UIColor whiteColor];

                }

                if( 1 == column){

                    l.frame = CGRectMake(columnOffset,  i * cellHeight , columnWidth -1 , cellHeight -1 );

                    [vLeftContent addSubview:l];

                }

                else if( 1 < column) {

                    [vRightContent addSubview:l];

                    columnOffset += columnWidth;

                }

                [l release];

            }

}

}

}

//-------------------------------以下为事件处发方法----------------------------------------

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

vTopRight.frame = CGRectMake(cellWidth, 0, vRight.contentSize.width, vTopRight.frame.size.height);

vTopRight.bounds = CGRectMake(scrollView.contentOffset.x, 0, vTopRight.frame.size.width, vTopRight.frame.size.height);

vTopRight.clipsToBounds = YES;

vRightContent.frame = CGRectMake(0, 0  , 

vRight.contentSize.width , contentHeight);

[selfaddSubview:vTopRight];

vRight.frame =CGRectMake(cellWidth, 0, self.frame.size.width - cellWidth, vLeft.contentSize.height); 

[vLeft addSubview:scrollView];

}

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

scrollView.frame = CGRectMake(cellWidth, 0, scrollView.frame.size.width, self.frame.size.height);

vRightContent.frame = CGRectMake(0, cellHeight - vLeft.contentOffset.y  , 

vRight.contentSize.width , contentHeight);

vTopRight.frame = CGRectMake(0, 0, vRight.contentSize.width, vTopRight.frame.size.height);

vTopRight.bounds = CGRectMake(0, 0, vRight.contentSize.width, vTopRight.frame.size.height);

[scrollView addSubview:vTopRight];

[self addSubview:scrollView];

}

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

if(!decelerate)

[selfscrollViewDidEndDecelerating:scrollView];

}

- (void) dealloc

{

    

[vLeftrelease];

[vRightrelease];

[vRightContentrelease];

[vLeftContentrelease];

[vTopLeftrelease];

[vTopRightrelease];

[superdealloc];

}

@end

原文地址:https://www.cnblogs.com/DamonTang/p/2645223.html