使用UIBezierPath绘制饼图

4

我正在尝试使用UIBezierPath绘制饼状图,离成功已经很接近了。然而,我遇到了一个问题,如下所示:

screenshot2

这是我使用的代码:

-(void)drawRect:(CGRect)rect
{
    CGRect bounds = self.bounds;
    CGPoint center = CGPointMake((bounds.size.width/2.0), (bounds.size.height/2.0));
    
    NSManagedObject *gameObject = [SCGameManager sharedInstance].gameObject;
    int playerNumber = 0;
    int totalOfPlayers = [(NSSet*)[gameObject valueForKey:@"playerColors"] count];
    float anglePerPlayer = M_PI*2 / totalOfPlayers;
    for (NSManagedObject *aPlayerColor in [gameObject valueForKey:@"playerColors"]){
        //Draw the progress
        CGFloat startAngle = anglePerPlayer * playerNumber;
        CGFloat endAngle = startAngle + anglePerPlayer;
        UIBezierPath *path = [UIBezierPath bezierPathWithArcCenter:center radius:self.frame.    size.width/2 startAngle:startAngle endAngle:endAngle clockwise:YES];

        UIColor *playerColor = [SCConstants getUIColorForPlayer:[[aPlayerColor valueForKey:@"colorIndex"] intValue]];
        [playerColor set];
        [path fill];
        playerNumber++;
    }
}

显然,我只需要将路径移动到圆形的中心,然后关闭它,但是当我添加以下代码行时:

[path addLineToPoint:self.center];
[path closePath];

它画出了一些奇怪的东西:screenshot1

你有没有想法,我的代码出了什么问题?我对贝塞尔曲线不是很熟悉,所以任何帮助都受欢迎!

谢谢!

1个回答

12

看起来你使用的中心点有问题。如果查看UIView的center属性文档,你会发现:

中心点在其父视图的坐标系内指定,并以点为单位测量。

你需要在该视图自己的坐标系中指定中心点,而不是父视图的坐标系。你已经在这里确定了视图在其自己的坐标系中的中心:

CGPoint center = CGPointMake((bounds.size.width/2.0), (bounds.size.height/2.0));

所以只需要将中心点从self.center改为center,像这样:

[path addLineToPoint:center];

1
非常好!非常感谢,问题已经解决了。 - Antoine Pastor

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接