-1

请原谅我,但我的知识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__

但是,填充颜色似乎没有生效,结果是:

在此处输入图像描述

我不明白我在这里做错了什么。

4

1 回答 1

0

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

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

于 2014-10-22T11:44:19.713 回答