我编写了自己的 NSMenu 类来在无边框 NSWindow 中的 NSSearchField 下方显示动态搜索结果。它运行良好,但如果我在 subview 顶部添加一些填充,则无法正确绘制神奇的 selectedMenuItemColor。我在容器 View 的顶部放置了一个 5 像素的填充来模拟 NSMenu,当我这样做时,蓝色选定的渐变看起来会消失。图片和代码应该清楚这一点:

这是我的项目 View 中的 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];
        }
    }
}

最佳答案

您必须获得图案相位原点以匹配您的 View 框架。

也就是说,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];
        }
    }
}

关于cocoa - 自定义 NSMenu 之类的 View 未正确显示 selectedMenuItemColor,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/9683192/

10-11 12:29