ios 用程序绘制饼图的demo

demo功能:用程序绘制饼图的demo。

demo说明:根据给定的标题数组,数值数组,和颜色数组绘制出一个饼状图。主要代码在:CLMView.m中。

demo截屏:

ios 用程序绘制饼图的demo_第1张图片


demo的主要代码:绘制部分

- (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)
		{
		}
		
		//只有弧度《 3.14 的才会画前面的厚度
		else if(startAngle < K_PI)
		{
			endAngle = K_PI;
			endx = 10;
			endy1 = 230+spaceHeight;
		}
		
		else
			break;
		 
		
		//CGContextSetBlendMode(context, kCGBlendModeMultiply);
		
		
		//绘制厚度
		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);			
		

	}
	
		
	//整体渐变
	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]];
		}
		
	}
	
}



CLMView.m的调用方法:


CLMView *cv = [[CLMView alloc] initWithFrame:CGRectMake(0, 0, 320, 440)];//实例化	

//指定标题数组
cv.titleArr = [NSArray	arrayWithObjects:@"iphone", @"sybian", @"windowbile", @"mego",@"android",nil];

//指定数值比例数组
cv.valueArr = [NSArray arrayWithObjects:[NSNumber numberWithFloat:20],[NSNumber numberWithFloat:20],\
				   [NSNumber numberWithFloat:20],[NSNumber numberWithFloat:20],[NSNumber numberWithFloat:20],nil];
//指定颜色数组
cv.colorArr = [NSArray arrayWithObjects:[UIColor yellowColor], [UIColor blueColor], [UIColor brownColor], [UIColor purpleColor] , [UIColor orangeColor],nil];
	
	[self.view addSubview: cv];
	[cv release];

demo下载地址:http://download.csdn.net/download/donny_zhang/5624889



你可能感兴趣的:(IOS开发,iOS,绘制,饼状图)