Невозможно установить цвет заливки в CGContext (CGContextSetFillColorWithColor)

Прошу прощения, но мои знания о CGContext довольно ограничены.

Я использую код из принятого ответа ЗДЕСЬ, чтобы рисовать звезды в 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__

Однако цвета заливки, похоже, не действуют, и результат:

введите здесь описание изображения

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


person n00bProgrammer    schedule 22.10.2014    source источник
comment
Внешний цикл for приводит к созданию 5 наборов звезд, причем более поздние наборы звезд покрывают более ранние наборы звезд (т. е. 1 черная звезда, затем 2 черные звезды с закрытой первой звездой, затем 3 черных звезды покрывают 2 черных звезды). звезды, затем 4 красные звезды, закрывающие 3 черные звезды и т. д.). Попробуйте изменить for (NSUInteger i = 0; i < 5; i++) { на for (NSUInteger i = 0; i < 2; i++) {, и вы должны увидеть черные звездочки.   -  person bobnoble    schedule 22.10.2014
comment
@bobnoble, ты был прав частично. Я реплицировал оператор for и добавил его после показанного кода с желаемым цветом и уменьшенным числом итераций. Это сработало. Вы должны опубликовать это как ответ, и я приму его.   -  person n00bProgrammer    schedule 22.10.2014


Ответы (1)


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

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

person Adis    schedule 22.10.2014