在NSView中绘制选项卡

时间:2009-12-31 20:56:01

标签: cocoa nsview

我正在为我的应用程序实现标签。一切都运作良好,除了我无法弄清楚当窗口重新占据主要状态时如何以较浅的灰色阴影绘制标签。我成功收到NSWindowDidBecomeMainNotification并重新绘制标签栏,但我不知道如何计算标签的新灰色。我目前正在使用所有绘图的图像。我尝试在整个标签栏上方绘制一个半透明层,使其更轻,但似乎不起作用。我可以为我使用的每个图像设置不透明度值,但这似乎不太理想。我也无法在Apple文档中找到有关此内容的任何信息。在这种情况下,最佳做法是什么?

3 个答案:

答案 0 :(得分:2)

你可以做的是让标签在代码中绘制,然后根本不绘制背景。让窗口的背景显示为活动或非活动状态。

您也可以考虑切换到PSMTabBarControl,这是一个可重复使用的标签栏类,已经编写并在多个应用程序中使用。 (而且我认为你已经解雇了NSTabView而不是你想要的外观。)

答案 1 :(得分:0)

我执行非活动控件的方法是在我的图形程序(Photoshop或Illustrator)中渲染相同图形的非活动状态版本,并在需要时绘制非活动版本。如果您绘制活动图像的50%透明版本,则需要先使用背景颜色进行擦除。

答案 2 :(得分:0)

您可以尝试使用半透明蒙版绘制图像。我通常使用的代码只是绘制一个图像,然后使用Quartz的透明层功能在图像的实际边界上填充矩形。我这是NSImage的一个类别:

@implementation NSImage (ShadedImageAddition)
- (void)drawAtPoint:(NSPoint)point shadeWithColor:(NSColor *)color intensity:(CGFloat)alpha
{
    NSRect imageRect;
    CGContextRef context = (CGContextRef)[[NSGraphicsContext currentContext] graphicsPort];

    imageRect.origin = point;
    imageRect.size = [self size];

    CGContextBeginTransparencyLayerWithRect(context, NSRectToCGRect(imageRect), NULL);

    [self drawInRect:imageRect fromRect:NSZeroRect operation:NSCompositeSourceOver fraction:1.0];
    [[color colorWithAlphaComponent:alpha] setFill];
    NSRectFillUsingOperation(imageRect, NSCompositeSourceAtop);

    CGContextEndTransparencyLayer(context);
}
@end

然后,当要在非关键窗口中绘制图像时,我通常会在其上绘制50%的白色遮罩。当然,您必须选择与位图一致的颜色和alpha值。

[myImage drawAtPoint:NSZeroPoint shadeWithColor:[NSColor whiteColor] intensity:0.50];