drawRect中不同颜色的不同行为:[重复]

Posted

技术标签:

【中文标题】drawRect中不同颜色的不同行为:[重复]【英文标题】:Different behaviours for different colors in drawRect: [duplicate] 【发布时间】:2015-08-16 16:33:44 【问题描述】:

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

- (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);

【问题讨论】:

在深入研究这个问题之前 - 您知道如果某些东西不像预期的那样看起来是个好主意吗?图片!!!两到三张截图就完美了。 将对CGContextSetRGBStrokeColor 的调用替换为一行:[[UIColor someColor] setStroke]; 【参考方案1】:

问题是

CGColorGetComponents([UIColor lightGrayColor].CGColor);

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

您应该使用另一个函数,如CGContextSetStrokeColorWithColorUIColor's setStroke method 来设置颜色。它们还具有更短的额外好处:)

【讨论】:

【参考方案2】:

类似于this answer 我猜darkGrayColorlightGrayColor 都代表灰度值而不是棕褐色rgba 值。因此没有 4 个组件,只有 2 个。

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

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

【讨论】:

谢谢,我确实误解了 CGColorGetComponents 的工作原理。

以上是关于drawRect中不同颜色的不同行为:[重复]的主要内容,如果未能解决你的问题,请参考以下文章

IOS使用drawrect在图像上创建蒙版

UIView 内容模式在覆盖 drawRect 时表现不同:

excel里多组重复数据如何显示不同颜色

Matplotlib简单的不同颜色线图[重复]

android中相同文本视图中文本的2种不同颜色[重复]

UiView背景颜色不同[重复]