NSStatus项目的自定义NSView类中的NSMenu未显示在状态栏底部



我创建了一个自定义视图类,因为我想要一个可以将项目拖动到的状态项。

以下是视图的定义:

@interface DragStatusView : NSImageView <NSMenuDelegate>{
    BOOL highlight;
}
@end

在ApplicationDelegate.m中,我实例化了一个NSStatusItem和一个DragStatusView的实例。我在DragStatusView上设置了图像,还将其菜单设置为包含一些NSMenuItems的NSMenu实例。

- (void)applicationDidFinishLaunching:(NSNotification *)notification
{
    // Install icon into the menu bar
    statusItem = [[[NSStatusBar systemStatusBar] statusItemWithLength:NSSquareStatusItemLength] retain];
    NSImage *statusImage = [NSImage imageNamed:@"Status"];
    [statusItem setImage:statusImage];


    [menuItem setTitle:NSLocalizedString(@"Special Status", @"imgur menu item text")];
    CGFloat itemHeight = [[NSStatusBar systemStatusBar] thickness];
    NSRect itemRect = NSMakeRect(0.0, 0.0, NSSquareStatusItemLength, itemHeight);
    DragStatusView* dragView = [[DragStatusView alloc] initWithFrame:itemRect];
    [dragView retain];
    [dragView setImage:statusImage]; 
    [dragView setMenu:menu];
    [statusItem setHighlightMode:YES];
    [statusItem setView:dragView];
}

以下是DragStatusView控制器中触发弹出菜单的方法:

- (void)mouseDown:(NSEvent *)event {
    [[[NSApp delegate] statusItem] popUpStatusItemMenu:[self menu]]; // or another method that returns a menu
}

这基本上是有效的,但是当您单击状态项时,菜单会显得太高。

单击前的外观:https://i.stack.imgur.com/coaQX.png

单击后的外观:https://i.stack.imgur.com/AzX3a.png(菜单出现在屏幕顶部——啊!)

如何使菜单显示在状态栏的底部?

谢谢!

如何弹出菜单?你想做的是这样的事情:

- (void)mouseDown:(NSEvent *)event {
    [statusItem popUpStatusItemMenu:[self menu]];
}

当然,您的视图将需要对状态项的引用。

终于开始工作了。

代码可以在这里看到:

https://github.com/zbuc/imgurBar/blob/master/imgur/ApplicationDelegate.mhttps://github.com/zbuc/imgurBar/blob/master/imgur/StatusItemView.m

我不太清楚为什么这个代码能工作,这让我很不舒服。它对边界矩形的处理略有不同,但我现在还不知道是什么让它起作用。

最新更新