[英]Popover for an OS X status bar app on NSStatusItem (MAAttachedWindow alternatives?)
[英]Popover NSStatusItem
我在玩一個想法,基本上我想要一個帶有 NSPopoverController 的 NSStatusItem。 我閱讀了人們遇到的所有問題,但我只是想嘗試一下。 現在有沒有干凈的方法來做到這一點? 我見過的所有版本都至少有 1 年的歷史,而且 suuuuper hacky。
到目前為止,這是我的方法,但是如果我在狀態欄中單擊我的應用程序,則沒有任何反應...
- (void)applicationDidFinishLaunching:(NSNotification *)aNotification
{
self.statusItem = [[NSStatusBar systemStatusBar] statusItemWithLength:NSVariableStatusItemLength];
//[self.statusItem setView:view];
[self.statusItem setTitle:@"Test"];
[self.statusItem setHighlightMode:YES];
[self.statusItem setAction:@selector(activatePopover:)];
}
-(IBAction)activatePopover:(id)sender
{
BOOL isEnabled = NO;
if (isEnabled) {
[self.popover showRelativeToRect:NSMakeRect(0, 0, 50, 50) ofView:statusItem.view preferredEdge:NSMinYEdge];
} else {
[self.popover close];
}
}
任何想法如何讓這個運行?
謝謝
如果不使用狀態項的自定義視圖,這將不起作用。 如果你不設置自定義視圖, view
屬性將為空(它只返回自定義視圖,而不是當你只使用setTitle
時NSStatusItem
內部使用的任何視圖)。
不幸的是,根據 Apple 的文檔,如果您想使用NSPopover
,您需要提供自己的視圖並自己處理點擊。
我還沒有看到一個完整的例子,它包含正確處理這個(狀態項的默認實現做了很多,你必須手動完成),並且還修復了彈出窗口不穩定:
NSPopover
,默認情況下,不會成為關鍵窗口(某些控件不起作用),除非您覆蓋canBecomeKeyWindow
窗口的 canBecomeKeyWindowpopUpStatusItemMenu
以正確聚焦您的狀態項)drawStatusBarBackgroundInRect
繪制突出顯示的背景NSRunningApplication.currentApplication.activateWithOptions
確保狀態項的所有窗口都處於活動狀態(否則您的彈出框將不規則地成為鍵盤輸入的接收器)NSEvent.addGlobalMonitorForEventsMatchingMask
(彈出窗口附帶的內置關閉機制不適用於狀態項)NSStatusBar.systemStatusBar.removeStatusItem
在終止時刪除狀態項我希望很快有一篇關於這個的博客文章(注意:我使用的是 RubyMotion,而不是 Objective-C),它解釋了所有這些問題,並希望為創建菜單提供一個更簡單的基礎。 如果我寫了那篇文章,我會更新這個評論。
代碼:
-(void)initializeStatusBarItem
{
self.statusItem = [[NSStatusBar systemStatusBar] statusItemWithLength:NSSquareStatusItemLength];
NSImage* image = [NSImage imageNamed:@"image"];
// [image setTemplate:YES];
self.statusItem.button.image = image;
self.statusItem.highlightMode = NO;
self.statusItem.button.action = @selector(statusBarItemDidClick:);
}
- (void)statusBarItemDidClick:(NSStatusBarButton *)sender{
MainViewController *mainView = [[MainViewController alloc] init];
self.popoverView = [[NSPopover alloc] init];
[self.popoverView setContentViewController:mainView];
self.popoverView.contentSize = CGSizeMake(300, 400);
self.popoverView.behavior = NSPopoverBehaviorTransient;
[self.popoverView showRelativeToRect:sender.bounds ofView:sender preferredEdge:NSMaxYEdge];
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.