8

Mavericks 以降、各画面には独自のステータス バーがあります。これは、(NSStatusItem を使用して) ステータス バーで実行されているアプリケーションには、理論的には複数の NSStatusItem オブジェクトが関連付けられていることも意味します。実際には、NSStatusItem の複数の「インスタンス」がユーザーに表示される場合がありますが、それは 1 つにすぎません (私はこれをテストしました)。ステータス アイコンでカスタム ビューを操作しているときに、次の問題が発生します。ユーザーがステータス アイコンをクリックすると、drawStatusBarBackgroundInRect メソッドを使用してプログラムで「強調表示」します。問題は、ステータス アイコン (画面ごとに 1 つ) の各「インスタンス」が、ユーザーが 1 つクリックしただけで強調表示されることです。この動作は、カスタム ビューのないステータス アイコンとは異なります。これを正しく実装する方法はありますか?

良い例として、複数のディスプレイを使用しているときに Dropbox ステータス アイコンをクリックするだけです。他の画面でもアイコンが選択されていることに気付くでしょう。

4

3 に答える 3

3

JLinX Apple Dev Forums のスレッドで言及されている Apple からの応答:

複数のメニュー バーを持つステータス アイテム

10.9 では複数のメニュー バーが導入され、それぞれがステータス アイテムを描画します。ステータス アイテムにカスタム ビューがある場合、このビューは 1 つのメニュー バーに配置され、他のメニュー バーは同じように見える「クローン」を取得します。クローンは API で公開されません。クローンは、カスタム ビューの描画を別のウィンドウにリダイレクトすることによって描画されます。これは、ステータス アイテムが描画先について推測してはならないことを意味します。たとえば、drawRect: の呼び出しがビューのウィンドウに向けられている、または描画先の解像度がステータス アイテムの画面の解像度と一致していると想定しないでください。また、以下で説明する場合を除き、ステータス アイテムが特定のディスプレイ上にあると想定してはなりません。クローンは NSDefaultRunLoopMode でのみ再描画されます。これにより、NSEventTrackingRunLoopMode などの別のモードで実行ループを駆動することにより、ステータス項目が強調表示を 1 つのディスプレイに制限できます。たとえば、メニューをシミュレートする場合は、window を表示するために mouseDown: を実装し、ウィンドウを閉じる必要があると判断するまで NSEventTrackingRunLoopMode で実行ループを実行します。実行ループがこのモードにある間は、真のステータス アイテムのみが再描画されます。クローン ステータス アイテムは再描画されないため、真のステータス アイテムに適用されるハイライトは表示されません。クローン ステータス アイテムをクリックすると、クローンは真のステータス アイテムと場所を交換します。これは、ステータス項目ウィンドウの位置と画面が mouseDown: 内から信頼できることを意味します。カスタム ビューからこの情報にアクセスできます。たとえば、

于 2015-08-01T05:42:30.767 に答える
0

あなたの質問はここで議論されています。画面を区別するために、デフォルトの実行ループ以外の実行ループでカスタムビューを描画してみてください...

于 2014-01-17T12:10:15.737 に答える
-2

別の方法として、ステータス アイテムと対話する代わりに、ビューで選択を描画することもできます。

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

これにより、ビューとクローンの両方に描画されます。

于 2014-05-06T10:56:02.627 に答える