如何在 CALayer 上绘制具有原生外观的状态项背景

Posted

技术标签:

【中文标题】如何在 CALayer 上绘制具有原生外观的状态项背景【英文标题】:How to draw a native looking statusitem background on a CALayer 【发布时间】:2010-01-08 18:54:55 【问题描述】:

其实我想在我自定义的statusItemView的CALayer上绘制一个选中的NSStatusItem的背景。但是自从

- (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;

知道吗?

【问题讨论】:

【参考方案1】:
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];

【讨论】:

这个选项比上面提供的子类化 CALayer 更容易。【参考方案2】:

尝试继承 CALayer 并将the drawInContext: method 实现为create an NSGraphicsContext for the CGContext、set the NSGraphicsContext as the current context,然后告诉状态项绘制其背景。

【讨论】:

这看起来很棒。你知道如何实现吗?谢谢。给我发电子邮件j.mp/a2email。非常感谢。【参考方案3】:

我在我的层委托中使用此代码:

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

【讨论】:

以上是关于如何在 CALayer 上绘制具有原生外观的状态项背景的主要内容,如果未能解决你的问题,请参考以下文章

如何创建具有原生外观的混合应用程序

具有本机外观的 Miglayout 具有不同的行为

如何在 CALayer 中绘制简单的位图文本?

使用 UIView 或 CALayer 绘制和动画?

如何在正确的位置渲染 CALayer 子层

Qt5:Android 上的原生外观小部件