Mavericks和NSStatusItem的自定义视图,带有多个监视器

Nie*_*aan 8 macos cocoa nsstatusitem nsstatusbar osx-mavericks

由于小牛每个屏幕都有自己的状态栏.这也意味着在状态栏中运行的应用程序(使用NSStatusItem)理论上有多个NSStatusItem对象关联.实际上,虽然用户可能会看到NSStatusItem的多个"实例",但它只是一个(我已经测试过了).现在,当您在状态图标中使用自定义视图时会出现以下问题:当用户单击状态图标时,我使用drawStatusBarBackgroundInRect方法以编程方式"突出显示"它.问题是状态图标的每个"实例"(每个屏幕一个)都会突出显示,尽管用户只是点击了一个.此行为与没有自定义视图的状态图标不同.有没有办法正确实现这个?

举个好例子,只需在使用多个显示器时点击Dropbox状态图标即可.你会注意到在另一个屏幕上选择了图标.

Val*_*gin 5

JLinX Apple Dev Forums 主题中提到的 Apple 的回应:

\n\n
\n

具有多个菜单栏的状态项

\n\n

10.9引入了多个菜单栏,每个菜单栏都绘制了状态项。如果您的状态项具有自定义视图,则该视图位于一个菜单栏中,而其他菜单栏则具有 \xe2\x80\x9cclone\xe2\x80\x9d,其看起来\n 相同。克隆不会在 API 中公开。克隆是通过将自定义视图\xe2\x80\x99 绘图重定向到另一个窗口来绘制的。\n 这意味着您的状态项不应\n 假设绘图目标。例如,它不应该假定对\n drawRect: 的调用是针对视图\xe2\x80\x99s 窗口,或者绘图目标的分辨率\n 与状态项\xe2\x80\ 的分辨率相匹配。 x99s\n 屏幕。您也不得假设状态项位于任何特定的显示屏上,除非如下所述。仅在 NSDefaultRunLoopMode 中重绘克隆。这允许状态项通过以另一种模式(例如 NSEventTrackingRunLoopMode)驱动运行循环来限制突出显示一个显示器。例如,如果您希望模拟菜单,则可以实现 mouseDown: 来显示窗口,并在 NSEventTrackingRunLoopMode 中运行运行循环,直到您确定应该关闭该窗口。当运行循环处于此模式时,只有真实状态项才会重绘。克隆状态项不会重绘,因此它们不会显示应用于真实状态项的任何突出显示。单击克隆状态项时,克隆会与真实状态项交换位置。这意味着状态项窗口的位置和屏幕在 mouseDown: 内是可靠的。您可以从自定义视图访问此信息,例如,使用 [[view window] screen] 将窗口放置在与状态项相同的屏幕上。

\n
\n


Jan*_*ler 0

你的问题在这里讨论。尝试在默认运行循环之外的运行循环中绘制自定义视图,以区分屏幕......

  • 请注意,上面的链接会转到 Apple 开发者论坛,只有当您拥有付费帐户时才能访问该论坛。 (2认同)