【问题标题】:Straightforward way to implement custom drawn NSMenuItem views实现自定义绘制的 NSMenuItem 视图的简单方法
【发布时间】:2017-02-01 12:21:12
【问题描述】:

我想要一个NSMenu,里面有几个NSMenuItems。这些项目的行为与“正常”NSMenuItems 一样,但有一个例外:我希望能够自己绘制每个项目的内容(即“前景”)。

即:

  • 我希望操作系统在我用鼠标悬停时绘制蓝色突出显示,绘制复选标记或破折号(表示“选中”/“多选的一部分” )。此外,我想要“正常”,即菜单内置鼠标/键盘行为。

  • 我想画“内容”我自己:理想情况下,我想我必须实现/覆盖一个方法drawMenuItem:withCGContext:inRectangle:withTextColor,它基本上获得了项目,要绘制的CGContext、项目的NSRect,以及Mac OS 将使用的文本颜色如果它自己绘制项目。

我知道(怀疑非常强烈)我的愿望可能太多了,但如果有足够的东西我会完全没问题的(例如,我可以想象自己从NSMenuItem 获取NSRect,使用类似的东西获取颜色[NSColor selectedMenuItemTextColor],以及使用 [NSContext currentContext] 之类的上下文。

我当然考虑过Apple's instruction on this。但是,这样做会阻止菜单绘制蓝色突出显示背景和复选标记。此外,据我所知,我将不得不实施例如mouseUp我自己。

总结一下:有没有办法获得(几乎)功能齐全的菜单,我只自定义通常菜单项标题所在的内容(甚至可能没有自定义视图)?

【问题讨论】:

  • 不能设置菜单项的图片吗?
  • @Willeke 我想过这个,但有点犹豫,因为我现在知道这是否是最初构思图像的目的。此外,我不确定是否可以直接根据NSMenuItem 的“突出显示”状态动态更改前景色。

标签: macos cocoa nsmenu nsmenuitem nspopupbutton


【解决方案1】:

答案是:不。

由于您要替换菜单项的整个视图,因此您负责绘制并处理事件。

【讨论】:

  • 您的回答可能是正确的。但难道我一开始就不必使用自定义视图吗?我希望有一些技术,可能没有自定义视图,来实现我所追求的。
  • 不幸的是,NSMenuItem 继承自 NSObject,因此没有(公共)视图相关的 API 可以覆盖。
  • 是的,我在视图层级调试器中观察到带有普通香草项目的NSMenu 不包含每个项目的子视图,而是似乎在整个菜单的NSView 中绘制所有内容.所以我想:“也许我可以继承这个……”
  • 我看到您可以为NSMenuItem 安装映像。我不能吗?只使用填充整个项目的图像?
  • 是的,你可以,但是布局约束是预定义的,图像显示在文本字段旁边的左侧。试试看吧。
猜你喜欢
  • 2014-02-27
  • 2011-05-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-06
  • 2023-04-06
  • 2015-01-15
  • 1970-01-01
相关资源
最近更新 更多