2017-04-20 48 views
0

东西显然出了毛病,我的第一次尝试询问以下问题:Mac/Cocoa:如何确定窗口的屏幕是否有菜单栏和Dock?

我想写应该把一个窗口或缩小其当前屏幕(显示器),而全屏模式遗留全屏切换功能不管空间的配置如何,其他屏幕的内容都不受影响。

我已经为“传统”空间模式工作,其中每个空间跨越所有连接的屏幕。在这种情况下,主屏幕上只有1个菜单栏和底座,可通过[[NSScreen screens] firstObject]获得。因此,我可以这样做

 if ([nsWin screen] == [[NSScreen screens] firstObject]) { 
      m_normalPresOpts = [nsApp presentationOptions]; 
      [nsApp setPresentationOptions:m_normalPresOpts | NSApplicationPresentationAutoHideMenuBar | NSApplicationPresentationAutoHideDock]; 
     } 

得到码头和菜单栏为自动隐藏,只有当全屏窗口是主屏幕上。

苹果公司无法在不重新启动登录会话的情况下切换空间设置,所以我现在甚至不知道当屏幕有单独的空间时上述代码是如何工作的。我怀疑[[NSScreen screens] firstObject]将仍然包含其左上角在(0,0)的屏幕,因此其他屏幕上的全屏窗口将继续显示菜单栏和Dock。另外,我仍然运行10.9,并且还希望能够立即为更高版本立即使用此功能。

有没有办法以编程方式确定如何配置空间或知道给定屏幕是否包含菜单栏/ Dock?谷歌搜索没有给我任何有关从代码做到这一点的结果。不知何故,我在我的磁盘文档中错过了[NSScreen +screensHaveSeparateSpaces],是我的问题的确切答案?

+0

即使使用“legacy”Spaces模式,Dock也不一定在主屏幕上。它可以配置为显示在桌面的左侧或右侧,可以放在另一个屏幕上。 –

+0

嗯,你说得对。如果辅助屏幕置于“主”屏幕下方,将其放在底部也是同样的事情。在这种情况下,您必须使用下面的Hofi的方法,或者将Dock设置为自动隐藏模式(如果可能,暂时)。 – RJVB

+0

我不知道,如果这是一个常见的设置。我会发现,当我需要在一个屏幕上工作一段时间(认为是笔记本电脑)时,不会在同一屏幕上同时显示两个元素,并且它们的相对位置也会发生变化,这让我很烦恼。这不适用于底部底座和垂直堆叠的屏幕,但有多少人会*,即* :) – RJVB

回答

1

有没有一种方法来确定程序如何配置空间或知道给定的屏幕是否包含菜单栏/码头?谷歌搜索没有给我任何有关从代码做到这一点的结果。不知怎的,我错过了[NSScreen + screensHaveSeparateSpaces]我的磁盘上的文件中,是明确的回答我的问题?

是的。

BTW你可能已经错过了它的文档中,如果您的文档已经过时,因为这方法被引入作为新的空间模型的一部分,而不记录 - 它只是在头文件存在。在此之间的某个时刻,文档被追上了。

+0

谢谢。这似乎是“答案”,但它有确认:) :) 是的,我运行10.9,我不确定通过Xcode可用的文档是真正的最新。我尽可能避免运行该IDE,大多数情况下使用Dash克隆浏览我的本地API文档。 (我真的很喜欢使用Xcode 3.2.x,但后来,单片版本...没有那么多。) – RJVB

1

NSScreen具有两个属性

这是在当前分辨率全屏矩形。此矩形包含当前由菜单栏和底座占用的任何空间。

visibleFrame

这是定义在它是目前安全提醒你的应用程序内容的屏幕部分的矩形。

返回的矩形总是基于当前用户界面的设置,不包括目前由基座和菜单栏占用的面积。因为它基于当前的用户界面设置,所以返回的矩形可以在调用之间切换,不应缓存。

即使启用了码头隐藏功能,此方法返回的矩形也可能小于全屏幕。系统使用一个小的边界区域来确定它应该显示底座的时间。

So, if they are different, than the screen has menubar and/or dock 
+0

我应该想到这一点;它会为缺乏'[NSScreen + screensHaveSeparateSpaces]'的10.9之前的系统提供解决方案。但等等,那些没有2个不一致的全屏模式:) 无论如何,谢谢。 – RJVB