2013-03-17 3 views
4

Я пытаюсь нарисовать PieChart с помощью 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

Похоже, что центральная точка, которую вы используете, является проблемой. В самом деле, если вы посмотрите на документацию по center имущества UIView, вы найдете:

Центр задается в системе координат ее надтаблицы и измеряется в баллах.

Вы хотите, чтобы центральная точка зрения была указана в ее собственной системе координат, а не в ее структуре. Вы уже определили центр зрения в своих собственных координатах здесь:

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

Так просто изменить точку, которую вы используете в качестве центральной точки от self.center до center, как это:

[path addLineToPoint:center]; 
+1

Хорошо заметили! Большое спасибо, это исправило это. –