我创建了一个自定义视图类,因为我想要一个可以将项目拖动到的状态项。
以下是视图的定义:
@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
我不太清楚为什么这个代码能工作,这让我很不舒服。它对边界矩形的处理略有不同,但我现在还不知道是什么让它起作用。