2013-03-17 147 views
4

我试图用UIBezierPath画一个饼图,和我很接近的话,但是,我有一个问题,因为你可以在附截图看到 screenshot2 下面是我使用的代码:绘制饼图与UIBezierPath

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

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

谢谢!

回答

9

看起来你正在使用的中心点是问题。事实上,如果你看一下的UIView的center性质的文件,你会发现:

中心是它的父坐标系中规定,并在点处测量。

您希望在自己的坐标系中指定视图的中心点,而不是其超级视图的中心点。你已经确定的视图的中心在其自己的坐标位置:

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

所以只是改变你使用作为中心点从self.centercenter点,就像这样:

[path addLineToPoint:center]; 
+1

看上去很好!非常感谢,修复它。 – 2013-03-17 14:32:36