繁体   English   中英

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

[英]Mavericks and NSStatusItem's custom view with multiple monitors

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

举一个很好的例子,当您使用多个显示器时,只需单击Dropbox状态图标。 您还会在另一个屏幕上注意到该图标的选择。

来自JLinX Apple Dev Forums主题提到的Apple的回复:

具有多个菜单栏的状态项

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

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

或者,您可以只在视图中绘制选择内容,而不必与状态项对话。

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

这将同时涵盖您的视图和克隆。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM