Nie*_*aan 8 macos cocoa nsstatusitem nsstatusbar osx-mavericks
由于小牛每个屏幕都有自己的状态栏.这也意味着在状态栏中运行的应用程序(使用NSStatusItem)理论上有多个NSStatusItem对象关联.实际上,虽然用户可能会看到NSStatusItem的多个"实例",但它只是一个(我已经测试过了).现在,当您在状态图标中使用自定义视图时会出现以下问题:当用户单击状态图标时,我使用drawStatusBarBackgroundInRect方法以编程方式"突出显示"它.问题是状态图标的每个"实例"(每个屏幕一个)都会突出显示,尽管用户只是点击了一个.此行为与没有自定义视图的状态图标不同.有没有办法正确实现这个?
举个好例子,只需在使用多个显示器时点击Dropbox状态图标即可.你会注意到在另一个屏幕上选择了图标.
JLinX Apple Dev Forums 主题中提到的 Apple 的回应:
\n\n\n\n具有多个菜单栏的状态项
\n\n10.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
| 归档时间: |
|
| 查看次数: |
1193 次 |
| 最近记录: |