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

时间:2013-11-16 16:58:54

标签: macos cocoa osx-mavericks nsstatusitem nsstatusbar

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

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

3 个答案:

答案 0 :(得分:3)

来自JLinX Apple Dev论坛提到的Apple的回应'螺纹:

  

包含多个菜单栏的状态项

     

10.9引入了多个菜单栏,每个菜单栏都绘制状态项。如果您的状态项具有自定义视图,则会定位此视图   在一个菜单栏中,其他菜单栏获得“克隆”,看起来   相同。 API中没有公开克隆。克隆是   通过将自定义视图的绘图重定向到另一个窗口来绘制。   这意味着您的状态项不应该对此进行假设   绘图目的地。例如,它不应该假设调用   drawRect:指向视图的窗口,或者说是分辨率   绘图目标与状态项的分辨率匹配   屏幕。您还必须不假设状态项位于任何状态项上   除了如下所述之外的特定显示。克隆只是   在NSDefaultRunLoopMode中重绘。这允许状态项限制   通过在另一种模式下驱动运行循环突出显示一个显示,   例如NSEventTrackingRunLoopMode。例如,如果你愿意的话   模拟一个菜单,你将实现mouseDown:来显示你的窗口,   并在NSEventTrackingRunLoopMode中运行运行循环,直到您确定   窗户应该被解雇。虽然运行循环在此   模式,只重绘真实状态项。克隆状态项将   不重绘,因此它们不会显示任何突出显示   真实状态项。单击克隆状态项时,克隆   与真实状态项交换位置。这意味着   状态项窗口的位置和屏幕从内部可靠   鼠标按下:.您可以从自定义视图中访问此信息   例如,使用[[view window] screen]将窗口定位在同一个窗口上   屏幕作为状态项。

答案 1 :(得分:0)

您的问题已经讨论here。尝试在默认运行循环以外的运行循环中绘制自定义视图,以区分屏幕...

答案 2 :(得分:-2)

或者,您只需在视图中绘制选择,而不是与状态项通话。

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

这将覆盖您的视图和克隆。