8

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

例如,当您使用多台显示器时,只需单击 Dropbox 状态图标即可。您也会注意到另一个屏幕上的图标选择。

4

3 回答 3

3

JLinX Apple Dev Forums 的帖子中提到的 Apple 的回复:

具有多个菜单栏的状态项

10.9 引入了多个菜单栏,每个菜单栏都绘制状态项。如果您的状态项具有自定义视图,则此视图位于一个菜单栏中,而其他菜单栏将获得一个“克隆”,看起来相同。克隆未在 API 中公开。通过将自定义视图的绘图重定向到另一个窗口来绘制克隆。这意味着您的状态项不应该对绘图目标做出假设。例如,不应假定对 drawRect: 的调用是针对视图窗口的,或者绘图目标的分辨率与状态项屏幕的分辨率相匹配。您也不得假设状态项在任何特定的显示器上,除非如下所述。克隆仅在 NSDefaultRunLoopMode 中重绘。这允许状态项通过以另一种模式(例如 NSEventTrackingRunLoopMode)驱动运行循环来将突出显示限制在一个显示上。例如,如果你想模拟一个菜单,你可以实现 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 回答