2011-01-14 3 views
3

У меня есть следующие компоненты - ColorButton, который представляет собой одиночную кнопку, которая является в основном цветным прямоугольником, и PaletteView, которая является сетью объектов ColorButton.Проблема в передаче UIColor предустановленное значение

код выглядит примерно так:

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]; 
} 

В этом случае я не прохожу autoreleased объекта UIColor, по сравнению с [UIColor grayColor] - autoreleased объекта.

Также следующий код работает:

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?

Спасибо!

ответ

2

Проблема в том, что вы запрашиваете компоненты цвета для CGColor с CGColorGetComponents. Этот метод может возвращать другое количество компонентов, в зависимости от цветового пространства базового цветного объекта. Например, [UIColor grayColor], вероятно, находится в цветовом пространстве в оттенках серого и поэтому устанавливает только цвета [0].

Если вы хотите установить цвет заливки для контекста, вы можете использовать CGContextSetFillColorWithColor, которые принимают объект CGColorRef напрямую, поэтому вам не нужно использовать компоненты вообще.

+0

Bingo! Этот API работает! Спасибо, что указали мне цветной материал. – lstipakov