【问题标题】:Custom NSMenu like view not displaying selectedMenuItemColor correctly自定义 NSMenu 类似视图未正确显示 selectedMenuItemColor
【发布时间】:2023-04-05 23:53:01
【问题描述】:

我编写了自己的 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];
        }
    }
}

【问题讨论】:

  • 当我尝试使用selectedMenuItemColor 时,我只得到深蓝色背景,而不是它上面的较亮渐变,如屏幕截图所示。您是否需要做一些特别的事情才能让它出现?
  • 不,我没有。想要粘贴我可以查看的要点吗?

标签: cocoa nsmenu


【解决方案1】:

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

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

【讨论】:

  • 非常感谢您在这里提供帮助。这不起作用,但将模式相位原点向上移动 5 个像素,即[curContext setPatternPhase: CGPointMake(0, 5)]。这是为什么呢?
  • 很好奇,因为它适用于我的目的,但是我的菜单项视图在底部留下了一个空白,而您的似乎在顶部留下了一个空白。似乎origin 上的patternPhase 在这两种情况下都应该有效,但我想不是。也许是翻转的坐标——对我来说,这些似乎总是导致不直观的结果。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-09-24
  • 1970-01-01
  • 2020-06-25
  • 1970-01-01
  • 2018-11-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多