drawRect 中不同颜色的不同行为:
Different behaviours for different colors in drawRect:
我对以下代码的工作方式感到困惑。
预计会产生一个被彩色圆圈包围的黑色圆盘。
它适用于某些颜色(如评论中所述),但不适用于其他一些颜色。
任何人都可以解释这种神秘的行为吗?
- (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);
}
类似于 this answer 我猜 darkGrayColor
和 lightGrayColor
都代表灰度值而不是棕褐色 rgba 值。因此没有 4 个组件,只有 2 个。
您可能想要/必须使用不同的颜色设置方法:
CGContextSetStrokeColorWithColor(context, [UIColor darkGrayColor].CGColor);
问题在于
CGColorGetComponents([UIColor lightGrayColor].CGColor);
不是 return 'light gray' 的 RGB 值。如果您在调试器中检查它的值,您会看到它是一个 0.6667, 1, 0, 0
的数组。这些是 gray-only color space.
中的组件
您应该使用 CGContextSetStrokeColorWithColor
or UIColor
's setStroke
method 等其他函数来设置颜色。它们还具有更短的额外好处:)
我对以下代码的工作方式感到困惑。 预计会产生一个被彩色圆圈包围的黑色圆盘。 它适用于某些颜色(如评论中所述),但不适用于其他一些颜色。 任何人都可以解释这种神秘的行为吗?
- (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);
}
类似于 this answer 我猜 darkGrayColor
和 lightGrayColor
都代表灰度值而不是棕褐色 rgba 值。因此没有 4 个组件,只有 2 个。
您可能想要/必须使用不同的颜色设置方法:
CGContextSetStrokeColorWithColor(context, [UIColor darkGrayColor].CGColor);
问题在于
CGColorGetComponents([UIColor lightGrayColor].CGColor);
不是 return 'light gray' 的 RGB 值。如果您在调试器中检查它的值,您会看到它是一个 0.6667, 1, 0, 0
的数组。这些是 gray-only color space.
您应该使用 CGContextSetStrokeColorWithColor
or UIColor
's setStroke
method 等其他函数来设置颜色。它们还具有更短的额外好处:)