无法在CGContext中设置填充颜色(CGContextSetFillColorWithColor)

时间:2014-10-22 11:01:56

标签: ios cgcontext cgcontextref

请原谅我,但我对CGContext的了解相当有限。

我使用接受的答案HERE中的代码在UIView中绘制星标。我想要实现的是以2种不同颜色显示星星(如评级视图)。问题是,我似乎无法为CGContextSetFillColorWithColor()使用2种不同的颜色。

相关代码:

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 个答案:

答案 0 :(得分:0)

当您为上下文设置填充颜色时,它将在该上下文中的每个对象上使用。在您的情况下,所有5颗星都是在相同的上下文中绘制的,因此只有最后一种颜色设置(红色)仍然存在。

您可以通过在一个上下文中绘制5个不同的CGPath来实现您想要实现的目标。