2014-10-22 3 views
-1

Простите меня, но мои знания CGContext довольно ограничены.Невозможно установить цвет заливки в CGContext (CGContextSetFillColorWithColor)

Я использую код из принятого ответа HERE, чтобы нарисовать звезды в UIView. То, что я хочу достичь, показывает звезды в двух разных цветах (например, рейтинг). Проблема в том, что я не могу использовать 2 разных цвета для CGContextSetFillColorWithColor().

Соответствующий код:

if (i < 3) { 

    NSLog(@"__BLACK__"); 

    CGContextSetFillColorWithColor(context, [UIColor blackColor].CGColor); 
    CGContextSetStrokeColorWithColor(context, [UIColor blackColor].CGColor); 

} else { 

    NSLog(@"__RED__"); 

    CGContextSetFillColorWithColor(context, [UIColor redColor].CGColor); 
    CGContextSetStrokeColorWithColor(context, [UIColor redColor].CGColor); 
} 

Полный код:

- (void) drawRect:(CGRect)rect { 

    int aSize = 20; 

    CGContextRef context = UIGraphicsGetCurrentContext(); 
    CGContextSetLineWidth(context, aSize); 

    CGFloat xCenter = 15.0; 
    CGFloat yCenter = 12.5; 

    float w = 25.0; 
    double r = w/2.0; 
    float flip = -1.0; 

    for (NSUInteger i = 0; i < 5; i++) { 

     if (i < 3) { 

      NSLog(@"__BLACK__"); 

      CGContextSetFillColorWithColor(context, [UIColor blackColor].CGColor); 
      CGContextSetStrokeColorWithColor(context, [UIColor blackColor].CGColor); 

     } else { 

      NSLog(@"__RED__"); 

      CGContextSetFillColorWithColor(context, [UIColor redColor].CGColor); 
      CGContextSetStrokeColorWithColor(context, [UIColor redColor].CGColor); 
     } 

     double theta = 2.0 * M_PI * (2.0/5.0); // 144 degrees 

     CGContextMoveToPoint(context, xCenter, r * flip + yCenter); 

     for (NSUInteger k = 1; k < 5; k++) { 

      float x = r * sin(k * theta); 
      float y = r * cos(k * theta); 
      CGContextAddLineToPoint(context, x + xCenter, y * flip + yCenter); 
     } 
     xCenter += 37.5; 
    } 

    CGContextClosePath(context); 
    CGContextFillPath(context); 
} 

На компиляции и выполнения я получаю журнал:

__BLACK__ 
__BLACK__ 
__BLACK__ 
__RED__ 
__RED__ 

Однако уточные цвета, кажется, не вступают в силу, и результатом является:

enter image description here

Я не понимаю, что я здесь делаю неправильно.

+1

Внешняя цепочка 'for' вызывает 5 наборов звезд, с более поздними наборами звезд, покрывающих более ранние множества звезд (т. Е. 1 черную звезду, затем две черные звезды с первой звездой, закрытой, затем 3 черные звезды, покрывающие 2 черные звезды, затем 4 красные звезды, покрывающие 3 черные звезды и т. д.). Попробуйте изменить 'for (NSUInteger i = 0; i <5; i ++) {' to 'for (NSUInteger i = 0; i <2; i ++) {', и вы должны увидеть черные звезды. – bobnoble

+0

@ bobnoble, вы были правы, частично. Я * реплицировал * инструкцию ** для ** и добавил ее после показанного кода, с моим желаемым цветом и сокращением итераций. Это сработало. Вы должны опубликовать это как ответ, и я соглашусь с ним. – n00bProgrammer

ответ

0

Когда вы устанавливаете цвет заливки для контекста, он используется для каждого объекта в этом контексте. В вашем случае все 5 звезд рисуются внутри одного и того же контекста, поэтому сохраняется только последняя настройка цвета (красная).

Возможно, вы достигнете того, чего хотите достичь, с помощью 5 различных CGPaths, выполненных в одном контексте.

Смежные вопросы