簡體   English   中英

Mavericks和NSStatusItem的具有多個監視器的自定義視圖

[英]Mavericks and NSStatusItem's custom view with multiple monitors

由於小牛,每個屏幕都有其自己的狀態欄。 這也意味着理論上在狀態欄中運行的應用程序(使用NSStatusItem)具有多個關聯的NSStatusItem對象。 在實踐中,盡管用戶可能會看到您的NSStatusItem的多個“實例”,但這僅僅是一個實例(我已經對此進行了測試)。 現在,當您在狀態圖標中使用自定義視圖時,會出現以下問題:當用戶單擊狀態圖標時,我使用drawStatusBarBackgroundInRect方法以編程方式“突出顯示”它。 問題是,盡管用戶只是單擊了狀態圖標的每個“實例”(每個屏幕一個),但都將突出顯示。 此行為與沒有自定義視圖的狀態圖標不同。 有沒有一種方法可以正確實現呢?

舉一個很好的例子,當您使用多個顯示器時,只需單擊Dropbox狀態圖標。 您還會在另一個屏幕上注意到該圖標的選擇。

來自JLinX Apple Dev Forums主題提到的Apple的回復:

具有多個菜單欄的狀態項

10.9引入了多個菜單欄,每個菜單欄都繪制狀態項。 如果您的狀態項具有自定義視圖,則該視圖位於一個菜單欄中,而其他菜單欄將獲得一個“克隆”,外觀相同。 克隆未在API中公開。 通過將自定義視圖的圖形重定向到另一個窗口來繪制克隆。 這意味着您的狀態項不應對繪圖目標進行假設。 例如,不應假定對drawRect:的調用是針對視圖窗口的,或者不應假定繪圖目標的分辨率與狀態項屏幕的分辨率相匹配。 除以下所述外,您還不得假定狀態項目在任何特定的顯示器上。 僅在NSDefaultRunLoopMode中重繪克隆。 通過在另一種模式(例如NSEventTrackingRunLoopMode)下驅動運行循環,這允許狀態項將突出顯示限制在一個顯示器上。 例如,如果您希望模擬菜單,則可以實現mouseDown:以顯示窗口,並在NSEventTrackingRunLoopMode中運行運行循環,直到您確定應該關閉該窗口為止。 當運行循環處於此模式時,將僅重繪真實狀態項。 克隆狀態項目不會重繪,因此不會顯示應用於真實狀態項目的任何突出顯示。 單擊克隆狀態項時,克隆將與真實狀態項交換位置。 這意味着狀態項窗口的位置和屏幕從mouseDown:內部是可靠的。 您可以從自定義視圖訪問此信息,例如,使用[[view window] screen]將窗口與狀態項放置在同一屏幕上。

您的問題在這里討論。 嘗試在默認循環以外的其他運行循環中繪制自定義視圖,以區分屏幕...

或者,您可以只在視圖中繪制選擇內容,而不必與狀態項對話。

- (void)drawRect:(NSRect)dirtyRect
{
    if( active )
    {
         [[NSColor selectedMenuItemColor] set];
         NSRectFill(self.bounds);
    }
}

這將同時涵蓋您的視圖和克隆。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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