drawRect中不同颜色的不同行为:

时间:2015-08-16 16:33:44

标签: ios uiview drawrect cgcontextref

我对以下代码的工作方式感到困惑。 预计会产生一个被彩色圆圈包围的黑色圆盘。 它适用于某些颜色(如评论中所述),但不适用于其他颜色。 任何人都可以解释这种神秘的行为吗?

- (void)drawRect:(CGRect)rect
{
    CGRect rectangle; CGFloat shiftVal=2.0,lineWidth=3.0;
    rectangle.origin=CGPointMake(shiftVal, shiftVal);
    rectangle.size=self.frame.size;
    rectangle.size.width-=shiftVal*2;
    rectangle.size.height-=shiftVal*2;
    CGContextRef context = UIGraphicsGetCurrentContext();
    CGContextSetRGBFillColor(context, 0.0, 0.0, 0.0, 1.0);
    CGContextFillEllipseInRect(context, rectangle);

    CGContextSetLineWidth(context, lineWidth);

    const CGFloat *components = CGColorGetComponents([UIColor greenColor].CGColor); // Works as expected.
    //const CGFloat *components = CGColorGetComponents([UIColor darkGrayColor].CGColor); // No surrounding circle (instead of darkGray).
    //const CGFloat *components = CGColorGetComponents([UIColor lightGrayColor].CGColor); // Produces a greenish circle (instead of lightGray)
    // Draw the outer circle:
    CGContextSetRGBStrokeColor(context,
                               components[0],
                               components[1],
                               components[2],
                               components[3]);
    CGContextStrokeEllipseInRect(context, rectangle);
}

2 个答案:

答案 0 :(得分:2)

问题在于

CGColorGetComponents([UIColor lightGrayColor].CGColor);

会返回'浅灰色'的RGB值。如果在调试器中检查其值,您将看到它是0.6667, 1, 0, 0的数组。这些是gray-only color space中的组件。

您应该使用其他功能,例如CGContextSetStrokeColorWithColorUIColor's setStroke method来设置颜色。它们还具有更短的额外好处:)

答案 1 :(得分:0)

this answer类似,我猜测darkGrayColorlightGrayColor都代表灰色值而不是tan rgba值。因此,没有4个comoponents但只有2个。

您可能希望/必须使用不同的方法来设置颜色:

CGContextSetStrokeColorWithColor(context, [UIColor darkGrayColor].CGColor);