Cocoa:[statusItem setView:myView]无论如何都会生成一个白条菜单项

时间:2009-03-27 12:05:43

标签: cocoa

在我的Mac OS X小应用程序中,我在系统菜单栏中显示一些信息。我用

statusItem = [
  [[NSStatusBar systemStatusBar]
   statusItemWithLength:NSVariableStatusItemLength]
   retain
];

它非常好用,我可以用

更改文本
[statusItem setTitle:[NSString stringWithString:@"Woo-hoo"]];

但它使用的默认菜单字体对于我相对不重要的信息来说太大了。所以我决定用自定义视图重新实现它。我在Interface Builder中创建了一个视图。

不幸的是,当我将其设置为带有

的菜单项的视图时
[statusItem setView:myView];

它只是在菜单中显示一个白色条而不是我的东西。我试着

[statusItem 
  drawStatusBarBackgroundInRect:[myView frame]
  withHighlight:NO];

没有成功。

在试图弄清楚问题是与视图本身有关还是以我将其分配到菜单栏的方式时,我创建了一个窗口并做了

[myTestWindow setContentView:myView];

这个无缝地工作。这让我觉得我的观点还可以: - )

那么,我还可以尝试让菜单项显示我自己的视图吗?

谢谢!

2 个答案:

答案 0 :(得分:5)

恰好是Interface Builder中窗口视图自动调整设置的一些奇怪的副作用(让我们称之为 size-effects )。在Inspector中,您可以设置子视图在超级视图大小调整时的大小调整方式。所以它在我的情况下以某种方式被打破,这样当窗口变得足够小(menuitem-high)时,我的元素就被绘制在窗口的框架之外。

我在IB中重新配置了尺寸,消除了我不需要的所有自动装置,现在它完美地工作:来自IB的视图显示在菜单项内。

答案 1 :(得分:2)

视图框架的高度是多少?也许你的观点比菜单栏高,你正在画它。当前的菜单栏是22像素,但您应该问systemStatusBar它的thickness,以防它发生变化。

尝试在视图周围绘制一个框架,看看是否有任何东西。

[[NSColor blueColor] set];
NSBezierPath *path = [NSBezierPath bezierPathWithRect:self.bounds];
[path setLineWidth:4.0f];
[path stroke];

如果只有蓝色的“L”形状(左下角),则视图太大。如果您得到一个矩形但仍然没有文本,那么您可能无法在视图中绘制文本,查看您正在绘制文本的坐标(并查看View Geometry)。将视图放在窗口中可能有效,因为它更大。

有关在状态菜单视图中使用文本的示例,请查看Matt Gemmell的NSStatusItemTest项目。

编辑:

抱歉,不知怎的,我错过了你说你在IB创建视图的地方。我做了一个快速测试,我可以看到你提到的白盒子。

NSStatusItemsetView:州的文档

  

自定义视图负责   绘制自己并提供自己的   行为,如处理鼠标   点击并发送操作信息。

状态项视图进入一个名为NSStatusBarWindow的特殊(苹果私有)窗口,它可能具有与普通窗口不同的内部行为,当然似乎不支持来自IB的视图。

所以是的,我认为你需要创建一个自定义的NSView子类并用drawrect做自己的绘图:。