Iphone画饼图工具类

项目中需要画饼图,在此将工具类添出来:

h文件:

#import <UIKit/UIKit.h>
#import <QuartzCore/QuartzCore.h>


@interface CLMView : UIView 
{

	float spaceHeight; //高度
	float scaleY ; 
	NSArray *titleArr ; //文字
	NSArray *valueArr; //值
	NSArray	*colorArr; //颜色
}

@property(nonatomic, assign)  float spaceHeight;
@property(nonatomic, assign) float scaleY;
@property(nonatomic, retain) NSArray *titleArr;
@property(nonatomic, retain) NSArray *valueArr;
@property(nonatomic, retain) NSArray *colorArr;

@end

m文件:

#import "CLMView.h"



#define K_PI 3.1415
#define KDGREED(x) ((x)  * K_PI * 2)


@implementation CLMView
@synthesize spaceHeight, scaleY;
@synthesize titleArr, valueArr, colorArr;


- (id)initWithFrame:(CGRect)frame {
    self = [super initWithFrame:frame];
    if (self) {
        // Initialization code
		self.backgroundColor = [UIColor colorWithRed:240.0f/255.0f green:1 blue:1 alpha:1.0];
		
		spaceHeight = 40;
		scaleY = 0.4;
		
				
    }
    return self;
}


- (void)drawRect:(CGRect)rect 
{
	CGContextRef context = UIGraphicsGetCurrentContext();
	//cgcontextsets
	
	//抗锯齿
	CGContextSetAllowsAntialiasing(context, TRUE);
	
//	int arr[5] = {20, 15, 35, 85 ,60};
	
	float sum = 0;
	
	
	for(int j=0;j< [valueArr count]; j++)
	{
		sum	 += [[valueArr objectAtIndex:j] floatValue];
	}
	
	
	CGContextMoveToPoint(context, 160, 230);
	
	float currentangel = 0;
	
	//饼图
	CGContextSaveGState(context);
	CGContextScaleCTM(context, 1.0, scaleY);

	currentangel = 0;
	for(int i = 0; i< [valueArr count]; i++)
	{

		float startAngle = KDGREED(currentangel);
		
		currentangel += [[valueArr objectAtIndex:i] floatValue] / sum;
		float endAngle = KDGREED(currentangel);
		//绘制上面的扇形
		CGContextMoveToPoint(context, 160, 230);
		
		[[colorArr objectAtIndex:i %  [valueArr count]] setFill];
		
		[[UIColor colorWithWhite:1.0 alpha:0.8] setStroke];
		
		CGContextAddArc(context, 160, 230, 150, startAngle, endAngle, 0);
		
		CGContextClosePath(context);
		CGContextDrawPath(context, kCGPathFill);
		
		
		
		//绘制侧面
		float starx = cos(startAngle) * 150  +160;
		float stary = sin(startAngle) * 150 + 230;
		
		float endx = cos(endAngle) * 150 + 160;
		float endy = sin(endAngle) * 150 + 230;
		
		//float starty1 = stary + spaceHeight;
		float endy1 = endy + spaceHeight;
		
		
		if(endAngle < K_PI)
		{
            
            //绘制厚度
            CGMutablePathRef path = CGPathCreateMutable();
            CGPathMoveToPoint(path, nil, starx, stary);
            CGPathAddArc(path, nil, 160, 230, 150, startAngle, endAngle, 0);
            CGPathAddLineToPoint(path, nil, endx, endy1);
            
            CGPathAddArc(path, nil, 160, 230 + spaceHeight, 150, endAngle, startAngle, 1);
            CGContextAddPath(context, path);
            
            [[colorArr objectAtIndex:i %  [valueArr count]] setFill];
            [[UIColor colorWithWhite:0.9 alpha:1.0] setStroke];
            
            CGContextDrawPath(context, kCGPathFill);
            
            [[UIColor colorWithWhite:0.1 alpha:0.4] setFill];
            CGContextAddPath(context, path);
            CGContextDrawPath(context, kCGPathFill);
		}
		
		//只有弧度《 3.14 的才会画前面的厚度
		else if(startAngle < K_PI)
		{
			endAngle = K_PI;
			endx = 10;
			endy1 = 230+spaceHeight;
            
            
            //绘制厚度
            CGMutablePathRef path = CGPathCreateMutable();
            CGPathMoveToPoint(path, nil, starx, stary);
            CGPathAddArc(path, nil, 160, 230, 150, startAngle, endAngle, 0);
            CGPathAddLineToPoint(path, nil, endx, endy1);
            
            CGPathAddArc(path, nil, 160, 230 + spaceHeight, 150, endAngle, startAngle, 1);
            CGContextAddPath(context, path);
            
            [[colorArr objectAtIndex:i %  [valueArr count]] setFill];
            [[UIColor colorWithWhite:0.9 alpha:1.0] setStroke];
            
            CGContextDrawPath(context, kCGPathFill);
            
            [[UIColor colorWithWhite:0.1 alpha:0.4] setFill];
            CGContextAddPath(context, path);
            CGContextDrawPath(context, kCGPathFill);
		}
		
		else
			//break
            ;
		 
		
		//CGContextSetBlendMode(context, kCGBlendModeMultiply);
		
		


			
		

	}
	
	
	
	//整体渐变
	CGFloat componets [] = {0.0, 0.0, 0.0, 0.5,0.0,0.0,0.0,0.1};
	
	CGColorSpaceRef colorspace = CGColorSpaceCreateDeviceRGB();
	
	CGGradientRef gradient = CGGradientCreateWithColorComponents(colorspace, componets, nil, 2);
	
	CGContextDrawRadialGradient(context, gradient, CGPointMake(160,230), 0, CGPointMake(160,230), 150, 0 );
	
	CFRelease(colorspace);
	CGGradientRelease(gradient);
	
	
	CGContextRestoreGState(context);
	
	//绘制文字
	
	for(int i = 0; i< [valueArr count]; i++)
	{
		float origionx = 50 ;
		float origiony = i * 30 + 200;
		
		[[colorArr objectAtIndex:i %  [valueArr count]] setFill];
		
		CGContextFillRect(context, CGRectMake(origionx, origiony, 20, 20));
		CGContextDrawPath(context, kCGPathFill);
		
		
		if(i< [titleArr count])
		{
			NSString *title = [ titleArr objectAtIndex:i];
			[title drawAtPoint:CGPointMake(origionx + 50, origiony) withFont:[UIFont systemFontOfSize:16]];
		}
		
	}
	
}


- (void)dealloc {
	[titleArr release];
	[valueArr release];
	[colorArr release];
    [super dealloc];
}


@end

调用:(主要是设置cv的titleArr,valueArr,colorArr)

NSMutableArray *title = [[NSMutableArray alloc]init];
    NSMutableArray *value = [[NSMutableArray alloc]init];
    NSMutableArray *color = [[NSMutableArray alloc]init];
    NSArray *Allcolor = [NSArray arrayWithObjects:[UIColor yellowColor], [UIColor blueColor],[UIColor redColor], [UIColor brownColor], [UIColor purpleColor] , [UIColor orangeColor],[UIColor greenColor],[UIColor grayColor],
        [UIColor colorWithRed:135.0f/255.0f green:206.0f/255.0f blue:235.0f/255.0f alpha:1],
        [UIColor colorWithRed:240.0f/255.0f green:1 blue:1 alpha:1],
         [UIColor colorWithRed:1 green:0 blue:1 alpha:1],
         [UIColor colorWithRed:0 green:199.0f/255.0f blue:140.0f/255.0f alpha:1],
         [UIColor colorWithRed:160.0f/255.0f green:32.0f/255.0f blue:240.0f/255.0f alpha:1],
         [UIColor colorWithRed:124.0f/255.0f green:252.0f/255.0f blue:0 alpha:1],
        nil];
    
    for(int i = 0;i<[self.onetableDatacostchat count];i++){
        float bilv = [[self.onetableDatacostchat objectAtIndex:i] floatValue]/[self.zongcost floatValue];
        float lastbilv = bilv*100;
        
        [title addObject:[NSString stringWithFormat:@"%@     %f%@",[self.onetableDatawenzichat objectAtIndex:i],lastbilv,@"%"]];
    
        
        [value addObject:[NSNumber numberWithInt:lastbilv]];
        [color addObject:[Allcolor objectAtIndex:i]];
    }
    
    CLMView *cv = [[CLMView alloc] initWithFrame:CGRectMake(0, 0, 320, 440)];
    
    cv.titleArr = title;
    cv.valueArr = value;
    cv.colorArr = color;
	
	[self.view addSubview: cv];
	[cv release];
    [title release];
    [value release];
    [color release];

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值