由于小牛每个屏幕都有自己的状态栏。这也意味着在状态栏中运行的应用程序(使用NSStatusItem)理论上有多个NSStatusItem对象关联。实际上,虽然用户可能会看到NSStatusItem的多个“实例”,但它只是一个(我已经测试过了)。现在,当您在状态图标中使用自定义视图时会出现以下问题:当用户单击状态图标时,我使用drawStatusBarBackgroundInRect方法以编程方式“突出显示”它。问题是状态图标的每个“实例”(每个屏幕一个)都会突出显示,尽管用户只是点击了一个。此行为与没有自定义视图的状态图标不同。有没有办法正确实现这个?
举个好例子,只需在使用多个显示器时点击Dropbox状态图标即可。你会注意到在另一个屏幕上选择了图标。
答案 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);
}
}
这将覆盖您的视图和克隆。