Как нарисовать нативно выглядящий фон статуса на CALayer - PullRequest
2 голосов
/ 08 января 2010

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

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

не работает (?) На слоях Я пробовал рисовать цвет с помощью свойства backgroundColor. Но преобразование selectedMenuItemColor в 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;
}

Есть идеи, как нарисовать естественный фон статуса на CALayer?

Ответы [ 3 ]

3 голосов
/ 14 апреля 2012
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];
2 голосов
/ 09 января 2010

Попробуйте создать подкласс CALayer и реализовать метод drawInContext: до , создать NSGraphicsContext для CGContext , , установить NSGraphicsContext в качестве текущего контекста , а затем сообщить элемент статуса, чтобы нарисовать его фон.

0 голосов
/ 03 апреля 2013

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

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