我正在製作一個處於狀態欄的應用程序。當狀態項被點擊時,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