我编写了自己的 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/