Benutzerdefinierte Ansicht von Mavericks und NSStatusItem mit mehreren Monitoren

8

Seit Mavericks hat jeder Bildschirm seine eigene Statusleiste. Dies bedeutet auch, dass einer Anwendung, die in der Statusleiste ausgeführt wird (mit NSStatusItem), theoretisch mehrere NSStatusItem-Objekte zugeordnet sind. Obwohl der Benutzer in der Praxis mehrere "Instanzen" Ihres NSStatusItems sehen kann, ist es nur eines (ich habe es getestet). Jetzt tritt das folgende Problem auf, wenn Sie mit einer benutzerdefinierten Ansicht in Ihrem Statussymbol arbeiten: Wenn der Benutzer auf das Statussymbol klickt, "programmiere" ich es mithilfe der Methode drawStatusBarBackgroundInRect programmgesteuert. Das Problem besteht darin, dass jede "Instanz" des Statussymbols (eines pro Bildschirm) hervorgehoben ist, obwohl der Benutzer gerade auf einen geklickt hat. Dieses Verhalten unterscheidet sich von einem Statussymbol ohne benutzerdefinierte Ansicht. Gibt es eine Möglichkeit, dies korrekt zu implementieren?

Als gutes Beispiel klicken Sie einfach auf das Dropbox-Statussymbol, wenn Sie mehrere Anzeigen verwenden. Sie werden die Auswahl des Symbols auch auf dem anderen Bildschirm bemerken.

    
Niels Mouthaan 16.11.2013, 16:58
quelle

3 Antworten

3

Die Antwort von Apple von JLinX Apple Dev Forums Thread erwähnt:

  

Statuselemente mit mehreren Menüleisten

     

10.9 führt mehrere Menüleisten ein, von denen jede die Statuselemente zeichnet. Wenn Ihr Statuselement eine benutzerdefinierte Ansicht hat, wird diese Ansicht positioniert   in einer Menüleiste, und andere Menüleisten erhalten einen "Klon", der aussieht   identisch. Die Klone sind in der API nicht verfügbar. Die Klone sind   gezeichnet, indem Sie die Zeichnung Ihrer benutzerdefinierten Ansicht in ein anderes Fenster umleiten.   Dies bedeutet, dass Ihr Statuselement keine Annahmen über die   Zeichnung Ziel. Zum Beispiel sollte es nicht davon ausgehen, dass ein Anruf an   drawRect: ist für das Fenster der Ansicht bestimmt, oder dass die Auflösung von   Das Zeichenziel entspricht der Auflösung der Statuselemente   Bildschirm. Sie dürfen auch nicht davon ausgehen, dass der Status item auf einem ist   bestimmte Anzeige, außer wie unten beschrieben. Die Klone sind nur   in NSDefaultRunLoopMode neu gezeichnet. Dadurch kann die Statusoption eingeschränkt werden   Hervorheben auf einer Anzeige, indem die Laufschleife in einem anderen Modus betrieben wird,   wie NSEventTrackingRunLoopMode. Zum Beispiel, wenn Sie möchten   simulieren Sie ein Menü, Sie würden mouseDown implementieren: um Ihr Fenster zu zeigen,   und führen Sie die Ausführungsschleife in NSEventTrackingRunLoopMode aus, bis Sie feststellen   dass das Fenster geschlossen werden sollte. Während die Laufschleife in diesem ist   Modus, wird nur das wahre Statuselement neu gezeichnet. Klonstatus-Elemente werden   nicht neu zeichnen, und daher werden sie keine hervorgehobene Markierung anzeigen   das wahre Statuselement Wenn auf ein Klonstatuselement geklickt wird, klonen Sie   tauscht Orte mit dem wahren Statuselement aus. Dies bedeutet, dass die   Standort und Bildschirm des Statuselementfensters sind von innen zuverlässig   Maus nach unten:. Sie können auf diese Informationen in Ihrer benutzerdefinierten Ansicht zugreifen, z   Beispiel: Verwenden Sie das Fenster [[Fenster anzeigen]], um ein Fenster auf demselben zu positionieren   Bildschirm als Statuselement.

    
Valentin Shergin 01.08.2015 05:42
quelle
0

Ihre Frage wird hier besprochen. Versuchen Sie, Ihre benutzerdefinierte Ansicht in einer anderen als der Standardlaufschleife zu zeichnen, um zwischen den Bildschirmen zu unterscheiden ...

    
JLinX 17.01.2014 12:10
quelle
-2

Alternativ können Sie auch die Auswahl in Ihrer Ansicht zeichnen, anstatt mit dem Statuselement zu sprechen.

%Vor%

Dadurch wird sowohl Ihre Ansicht als auch der Klon gezeichnet.

    
Curtis Hard 06.05.2014 10:56
quelle