自定义NSMenu就像视图没有正确显示selectedMenuItemColor

时间:2012-03-13 11:35:00

标签: cocoa nsmenu

我编写了自己的NSMenu类,在无边界的NSWindow中显示NSSearchField以下的动态搜索结果。它运行良好,但如果我在子视图的顶部添加一些填充,则无法正确绘制魔术selectedMenuItemColor。我在容器视图的顶部放置了一个5像素的填充来模仿NSMenu,当我这样做时,蓝色选择的渐变看起来很像。一张图片&代码应该明确这一点:

enter image description here

这是我的项目视图中的drawRect代码(请记住这只是一个常规的NSView):

-(void) drawRect:(NSRect)dirtyRect {
    CGRect b = self.bounds;
    if (selected) {

        [NSGraphicsContext saveGraphicsState];

        [[NSColor selectedMenuItemColor] set];
        NSRectFill( b );

        [NSGraphicsContext restoreGraphicsState];
        if (textField) {
            textField.textColor = [NSColor selectedMenuItemTextColor];
        }
    } else {
        [[NSColor clearColor] set];
       NSRectFillUsingOperation(b, NSCompositeSourceOver);
        if (textField) {
            textField.textColor = [NSColor blackColor];
        }
    }
}

1 个答案:

答案 0 :(得分:0)

您必须获取模式阶段原点以匹配您的视图框架。

也就是说,selectedMenuItemColor实际上是一种模式,而不是一种颜色,并且该模式旨在显示"正确"在"标准菜单项高度"增量。因为你已经添加了填充,现在它没有被标记为"标准"位置。

试试这个:

-(void) drawRect:(NSRect)dirtyRect {
    CGRect b = self.bounds;
    if (selected) {

       NSPoint origin = [self frame].origin;
       curContext = [NSGraphicsContext currentContext];
       [curContext saveGraphicsState];
       [curContext setPatternPhase: origin];

        [[NSColor selectedMenuItemColor] set];
        NSRectFill( b );

        [curContext restoreGraphicsState];
        if (textField) {
            textField.textColor = [NSColor selectedMenuItemTextColor];
        }
    } else {
        [[NSColor clearColor] set];
       NSRectFillUsingOperation(b, NSCompositeSourceOver);
        if (textField) {
            textField.textColor = [NSColor blackColor];
        }
    }
}