2010-01-08 2 views
2

На самом деле, я хочу нарисовать фон выбранного NSStatusItem на CALayer моего пользовательского statusItemView. Но так какКак нарисовать родной взгляд statusitem фона на CALayer

- (void)drawStatusBarBackgroundInRect:(NSRect)rect withHighlight:(BOOL)highlight

не работает (?) На слоях я пробовал рисовать цвет со свойством BackgroundColor. Но преобразование выбранногоMenuItemColor в RGB не очень помогает. Это выглядит просто без градиента. : -/

я преобразовал [NSColor selectedMenuItemColor] в CGColorRef с этим кодом:

- (CGColorRef)highlightColor { 
    static CGColorRef highlight = NULL; 
    if(highlight == NULL) { 
     CGFloat red, green, blue, alpha; 
     NSColor *hlclr = [[NSColor selectedMenuItemColor] colorUsingColorSpace: 
        [NSColorSpace genericRGBColorSpace]]; 
     [hlclr getRed:&red green:&green blue:&blue alpha:&alpha]; 
     CGFloat values[4] = {red, green, blue, alpha}; 
     highlight = CGColorCreate([self genericRGBSpace], values); 
    } 
    return highlight; 
} 

Любая идея, как сделать нативный глядя statusitem фон на CALayer?

ответ

2

Попробуйте выполнить подклассификацию CALayer и реализуйте the drawInContext: method по номеру create an NSGraphicsContext for the CGContext, set the NSGraphicsContext as the current context, а затем укажите элемент состояния, чтобы нарисовать его фон.

+0

Это выглядит здорово. Вы знаете, как это реализовать? Благодарю. Напишите мне по адресу http://j.mp/a2email. Спасибо. –

3
NSImage *backgroundImage = [[NSImage alloc] initWithSize:self.frame.size]]; 
[backgroundImage lockFocus]; 
[self.statusItem drawStatusBarBackgroundInRect:self.bounds withHighlight:YES]; 
[backgroundImage unlockFocus]; 
[self.layer setContents:backgroundImage]; 
[backgroundImage release]; 
+0

Эта опция проще, чем подклассификация CALayer, как предлагается выше. – Bobjt

0

Я использую этот код в моем слое делегата:

- (void)drawLayer:(CALayer *)layer 
     inContext:(CGContextRef)context { 
    NSGraphicsContext* gc = [NSGraphicsContext graphicsContextWithGraphicsPort:context flipped:NO]; 
    [NSGraphicsContext saveGraphicsState]; 
    [NSGraphicsContext setCurrentContext:gc]; 
    [self.statusItem drawStatusBarBackgroundInRect:self.frame 
            withHighlight:self.isHighlighted]; 
    [NSGraphicsContext restoreGraphicsState]; 
} 
Смежные вопросы