簡體   English   中英

彈出 NSStatusItem

[英]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屬性將為空(它只返回自定義視圖,而不是當你只使用setTitleNSStatusItem內部使用的任何視圖)。

不幸的是,根據 Apple 的文檔,如果您想使用NSPopover ,您需要提供自己的視圖並自己處理點擊。

我還沒有看到一個完整的例子,它包含正確處理這個(狀態項的默認實現做了很多,你必須手動完成),並且還修復了彈出窗口不穩定:

  • NSPopover ,默認情況下,不會成為關鍵窗口(某些控件不起作用),除非您覆蓋canBecomeKeyWindow窗口的 canBecomeKeyWindow
  • 正確關閉其他狀態項的菜單(您可以使用空菜單調用popUpStatusItemMenu以正確聚焦您的狀態項)
  • 使用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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM