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