項目中需要畫餅圖,在此將工具類添出來:
h文件:
[cpp]
#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文件:
[cpp]
#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;
//繪制厚度 www.2cto.com
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)
[cpp]
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];
摘自 RiverAM的專欄