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

标签 cocoa

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

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

它工作得很好,我可以用它来更改文本

[statusItem setTitle:[NSString stringWithString:@"Woo-hoo"]];

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

但是不幸的是,当我将其设置为菜单项的 View 时

[statusItem setView:myView];

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

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

没有成功。

在试图弄清楚问题是否出在 View 本身或我将其分配给菜单栏的方式时,我创建了一个窗口并执行了

[myTestWindow setContentView:myView];

这个工作顺利进行。这让我觉得我的观点是好的:-)

那么,我还可以尝试什么让菜单项显示我自己的 View ?

谢谢!

最佳答案

这恰好是 Interface Builder 中窗口 View 自动调整大小设置的一些奇怪的副作用(我们称之为尺寸效应)。在检查器中,您可以设置如何根据 super View 大小调整 subview 的大小。因此,在我的情况下,它在某种程度上被破坏了,这样当窗口变得足够小(menuitem-high)时,我的元素就被绘制在窗口框架之外。

我在 IB 中重新配置了大小调整,消除了所有不需要的自动设置,现在它工作得很好:IB 中的 View 显示在菜单项内。

关于Cocoa: [statusItem setView:myView] 无论如何都会创建一个白条菜单项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/689513/

相关文章:

iphone - 我正在制作一个应用程序,涉及将数据保存到文本字段并将其加载回来。它可以在模拟器中运行,但不能在我的实际 iPhone 上运行。为什么这样?

ios - 有人得到 [[NSBundle mainBundle] pathForResource :ofType:inDirectory] to work recursively?

objective-c - 要创建一个空字典,[NSMutableDictionary dictionary] 或 [[NSMutableDictionary alloc] init]?

objective-c - 复制 View

iphone - IBOutlet 属性是否必须是非原子的?

objective-c - NSTextView 设置格式器?

cocoa - 如何创建颜色选择器轮 slider ?

objective-c - Window 总是想领先于其他人 - Xcode

objective-c - 如何确定用户是否已滚动到 NSTableView 的末尾

cocoa - 尝试访问超出数组范围的索引