Проблема передачи заданного значения UIColor - PullRequest
3 голосов
/ 14 января 2011

У меня есть следующие компоненты - 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 greyColor]?И как правильно решить мою задачу - передать значения цвета из PaletteView в ColorButton?

Спасибо!

1 Ответ

2 голосов
/ 14 января 2011

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

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

...