Draw a pie chart with UIBezierPath
我正在尝试使用 UIBezierPath 绘制饼图,并且我非常接近这样做,但是,我遇到了一个问题,正如您在随附的屏幕截图中看到的那样
这是我正在使用的代码:
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]; |
它画了一些奇怪的东西:
您知道我的代码出了什么问题吗?我根本不是贝塞尔专家,所以欢迎任何帮助!
谢谢!
您使用的中心点似乎是问题所在。事实上,如果你查看 UIView 的
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)); |
所以只需将您用作中心点的点从
1 | [path addLineToPoint:center]; |