如何在没有核心图的情况下在饼图上绘制UILabel?

时间:2013-12-09 10:56:25

标签: ios uilabel pie-chart

我使用以下代码绘制了饼图:

1)创建 UIView 自定义类饼图

2)在 drawRect

int c=[itemArray count];
[_label removeFromSuperview];
CGFloat angleArray[c];
 offset = 0.0;

int sum=0;
CGContextRef context = UIGraphicsGetCurrentContext();
CGContextSetAllowsAntialiasing(context, false);
CGContextSetShouldAntialias(context, false);

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

    sum+=[[itemArray objectAtIndex:i] intValue];
}

for(int i=0;i<[itemArray count];i++)
{
    angleArray[i]=(float)(([[itemArray objectAtIndex:i] intValue])/(float)sum)*(2*3.14); // in radians
    CGContextMoveToPoint(context, radius, radius);
    if(i==0)
    {
        CGContextAddArc(context, radius, radius, radius, 0,angleArray[i], 0);

    }
    else
    {
        CGContextAddArc(context, radius, radius, radius,offset,offset+angleArray[i], 0);

    }
    offset+=angleArray[i];

    CGContextSetFillColorWithColor(context, ((UIColor *)[myColorArray objectAtIndex:i]).CGColor);
    CGContextClosePath(context); 
    CGContextFillPath(context);
}

3)问题是如何在每个部分上绘制标签。

2 个答案:

答案 0 :(得分:0)

您可以通过此公式将极坐标转换为笛卡尔坐标

x =半径* cos(角度);

y =半径* sin(角度);

点(x,y)可以是标签的中心。

在您的情况下,角度在起始角度和结束角度之间是AVG。半径是饼图中心与标签之间的距离。

答案 1 :(得分:0)

- (CGPoint)getApproximateMidPointForArcWithStartAngle:(CGFloat)startAngle andDegrees:(CGFloat)endAngle {

NSLog(@"start angle %f, end angle %f",startAngle,endAngle);
CGFloat midAngle = DEGREES_TO_RADIANS((startAngle + endAngle) / 2);
NSLog(@"midangle %f ",midAngle);
CGFloat x=0;
CGFloat y=0;
x= (250) + (250 * cos(midAngle));
y= (250) + (250 * sin(midAngle));

CGPoint approximateMidPointCenter = CGPointMake(((x+250)/2), ((y+250)/2));
return approximateMidPointCenter; }

此处 approximateMidPointCenter 是加入圈子中心和弧线中心的中点

label.center = approximateMidPointCenter