如何在 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 上绘制具有原生外观的状态项背景的主要内容,如果未能解决你的问题,请参考以下文章