传递UIColor预设值时出现问题

时间:2011-01-14 19:27:26

标签: iphone objective-c uibutton uicolor

我有以下组件 - 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?

谢谢!

1 个答案:

答案 0 :(得分:2)

问题是您要求使用CGColorGetComponents的CGColor颜色组件。此方法可能返回不同数量的组件,具体取决于基础颜色对象的颜色空间。例如,[UIColor grayColor]可能位于灰度色彩空间中,因此仅设置颜色[0]。

如果要为上下文设置填充颜色,可以使用直接获取CGColorRef对象的CGContextSetFillColorWithColor,因此根本不需要使用这些组件。