我正在制作一个处于状态栏的应用程序。当状态项被点击时,NSPopover弹出。弹出窗口处于状态栏时的NSPopover瞬变状态
它看起来像这样:
这里的问题:我想这是“短暂的”,也就是说,如果我点击酥料饼以外的任何位置,它就会关闭。虽然NSPopoverBehaviorTransient在弹出窗口处于窗口时可以正常工作,但它在状态栏中时不起作用。
我该如何自己实现这样的行为?
我正在制作一个处于状态栏的应用程序。当状态项被点击时,NSPopover弹出。弹出窗口处于状态栏时的NSPopover瞬变状态
它看起来像这样:
这里的问题:我想这是“短暂的”,也就是说,如果我点击酥料饼以外的任何位置,它就会关闭。虽然NSPopoverBehaviorTransient在弹出窗口处于窗口时可以正常工作,但它在状态栏中时不起作用。
我该如何自己实现这样的行为?
原来很容易:
- (IBAction)openPopover:(id)sender
{
// (open popover)
if(popoverTransiencyMonitor == nil)
{
popoverTransiencyMonitor = [NSEvent addGlobalMonitorForEventsMatchingMask:NSLeftMouseDownMask|NSRightMouseDownMask handler:^(NSEvent* event)
{
[self closePopover:sender];
}];
}
}
- (IBAction)closePopover:(id)sender
{
if(popoverTransiencyMonitor)
{
[NSEvent removeMonitor:popoverTransiencyMonitor];
popoverTransiencyMonitor = nil;
}
// (close popover)
}
什么是不容易的,虽然是有讨厌的问题与具有酥料饼蹦出来NSStatusItem的(如需要的话并没有表现时的使命控制被调用或空间切换到全屏窗口)。我必须实现一个自定义窗口,它始终漂浮在NSStatusItem之上,并处理切换到全屏窗口等等。这似乎很容易,但显然状态项目并非针对类似的东西设计的;)
我使用类似于上面的答案,除了我将所有内容组合为一个方法而不是使用两个单独的IBActions。
首先,我声明如下性质
@property (strong, nonatomic) NSStatusItem *statusItem;
@property (strong, nonatomic) NSEvent *popoverTransiencyMonitor;
@property (weak, nonatomic) IBOutlet NSPopover *popover;
@property (weak, nonatomic) IBOutlet NSView *popoverView;
然后在awakeFromNib我设置状态栏项
- (void)awakeFromNib {
self.statusItem = [[NSStatusBar systemStatusBar] statusItemWithLength:NSVariableStatusItemLength];
self.statusItem.title = @"Title";
self.statusItem.highlightMode = YES;
self.statusItem.action = @selector(itemClicked:);
}
其次是状态栏项被点击
时所调用的方法- (void)itemClicked:(id)sender {
[[self popover] showRelativeToRect:[sender bounds] ofView:sender preferredEdge:NSMinYEdge];
if (self.popoverTransiencyMonitor == nil) {
self.popoverTransiencyMonitor = [NSEvent addGlobalMonitorForEventsMatchingMask:(NSLeftMouseDownMask | NSRightMouseDownMask | NSKeyUpMask) handler:^(NSEvent* event) {
[NSEvent removeMonitor:self.popoverTransiencyMonitor];
self.popoverTransiencyMonitor = nil;
[self.popover close];
}];
}
}
这会使弹出窗口出现,并且在用户单击时也会关闭视野之外。
请注意,在Interface Builder中,必须将弹出窗口的行为设置为“瞬态”,以便在用户单击状态项时弹出窗口将关闭。
与系统状态项的一致行为:'addGlobalMonitorForEventsMatchingMask:NSLeftMouseDownMask | NSRightMouseDownMask' - 以便右键单击也可以关闭弹出窗口。 – inket 2013-10-19 23:19:14