代码之家  ›  专栏  ›  技术社区  ›  Ilya Birman

Cocoa:[statusItem setView:myView]无论发生什么情况,都会生成一个白色的条形菜单项

  •  4
  • Ilya Birman  · 技术社区  · 16 年前

    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 回复  |  直到 16 年前
        1
  •  5
  •   Ilya Birman    16 年前

    这恰好是Interface Builder中窗口视图自动调整大小设置的一些奇怪的副作用(让我们调用它们) 尺寸效应 )。在Inspector中,您可以设置子视图在调整superview大小时如何调整大小。所以在我的例子中它被打破了,当窗口变得足够小(menuitem高)时,我的元素就被画到了窗口框架的外面。

        2
  •  2
  •   Nathan Kinsinger    16 年前

    视图框架的高度是多少?也许你的视图比菜单栏高,你在菜单栏外画画。当前菜单栏为22像素,但您应该询问 systemStatusBar 因为它是 thickness ,以防万一。

    试着在视图周围画一个框架,看看你是否得到了什么。

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

    View Geometry )。将视图放在窗口中可能会起作用,因为它更大。

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

    编辑:

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

    文件 NSStatusItem setView:

    绘制自身并提供自己的 行为,例如处理鼠标 单击并发送操作消息。

    状态项视图进入一个名为NSStatusBarWindow的特殊(apple private)窗口,该窗口的内部行为可能与普通窗口不同,显然不支持来自IB的视图。

    因此,是的,我认为您需要创建一个自定义NSView子类,并在drawrect:中绘制自己的图形。