关于ios:用UIBezierPath画饼图

Draw a pie chart with UIBezierPath

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
-(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++;
    }
}

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

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

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

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

谢谢!


您使用的中心点似乎是问题所在。事实上,如果你查看 UIView 的 center 属性的文档,你会发现:

The center is specified within the coordinate system of its superview and is measured in points.

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

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

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

1
[path addLineToPoint:center];