我有以下组件 - ColorButton,表示基本上是彩色矩形的单个按钮,以及PaletteView,它是ColorButton对象的网格。
代码看起来像这样:
ColorButton.h
@interface ColorButton : UIButton {
UIColor* color;
}
-(id) initWithFrame:(CGRect)frame andColor:(UIColor*)color;
@property (nonatomic, retain) UIColor* color;
@end
ColorButton.m
@implementation ColorButton
@synthesize color;
- (id)initWithFrame:(CGRect)frame andColor:(UIColor*)aColor{
self = [super initWithFrame:frame];
if (self) {
self.color = aColor;
}
return self;
}
- (void)drawRect:(CGRect)rect {
CGContextRef context = UIGraphicsGetCurrentContext();
const float* colors = CGColorGetComponents(color.CGColor);
CGContextSetRGBFillColor(context, colors[0], colors[1], colors[2], colors[3]);
CGContextFillRect(context, rect);
}
PaletteView.m
- (void) initPalette {
ColorButton* cb = [[ColorButton alloc] initWithFrame:CGRectMake(0, 0, 30, 30) andColor:[UIColor grayColor]];
[self addSubview:cb];
}
问题在于它不起作用 - 没有任何东西在视野中绘制。但是,以下代码可以正常工作。
PaletteView.m
- (void) initPalette {
UIColor *color = [[UIColor alloc]
initWithRed: (float) (100/255.0f)
green: (float) (100/255.0f)
blue: (float) (1/255.0f)
alpha: 1.0];
ColorButton* cb = [[ColorButton alloc] initWithFrame:CGRectMake(0, 0, 30, 30) andColor:color];
[self addSubview:cb];
}
在这种情况下,我传递的不是自动释放的UIColor对象,与[UIColor grayColor] - 自动释放的对象相比。
以下代码也适用:
ColorButton.m
- (id)initWithFrame:(CGRect)frame andColor:(UIColor*)aColor{
self = [super initWithFrame:frame];
if (self) {
//self.color = aColor;
self.color = [UIColor redColor];
}
return self;
}
有人可以解释这里发生了什么,为什么我不能传递像[UIColor grayColor]这样的对象?什么是解决我的任务的正确方法 - 将颜色值从PaletteView传递到ColorButton?
谢谢!
答案 0 :(得分:2)
问题是您要求使用CGColorGetComponents
的CGColor颜色组件。此方法可能返回不同数量的组件,具体取决于基础颜色对象的颜色空间。例如,[UIColor grayColor]
可能位于灰度色彩空间中,因此仅设置颜色[0]。
如果要为上下文设置填充颜色,可以使用直接获取CGColorRef对象的CGContextSetFillColorWithColor
,因此根本不需要使用这些组件。