4

我正在尝试使用 UIBezierPath 绘制 PieChart,而且我非常接近这样做,但是,我遇到了一个问题,正如您在随附的屏幕截图中看到的那样, 截图2 这是我正在使用的代码:

-(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];

它画了一些奇怪的东西: 截图1

你知道我的代码出了什么问题吗?我根本不是贝塞尔专家,所以欢迎任何帮助!

谢谢!

4

1 回答 1

12

看起来您正在使用的中心点是问题所在。事实上,如果你查看centerUIView 属性的文档,你会发现:

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

您希望在其自己的坐标系中指定视图的中心点,而不是其父视图的中心点。您已经在此处以自己的坐标确定了视图的中心:

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

因此,只需将您用作中心点的点从self.center更改为center,如下所示:

[path addLineToPoint:center];
于 2013-03-17T14:03:31.740 回答