Mac/Cocoa:如何判断window的屏幕是否有菜单栏和Dock?

Mac/Cocoa: how to determine if a window's screen has menubar and Dock?

我第一次尝试提出以下问题时显然出了点问题:

我正在尝试编写一个遗留的全屏切换函数,该函数应该 window 在其当前屏幕(显示器)上进入或退出全屏模式,同时不影响其他屏幕的内容 - 不管如何Space已配置。

我已经为 "legacy" Spaces 模式工作,其中每个 Space 跨越所有附加屏幕。在那种情况下,主屏幕上只有 1 个菜单栏和 Dock,可以使用 [[NSScreen screens] firstObject] 获得。因此,我可以做类似

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

让 Dock 和菜单栏仅在全屏 window 在主屏幕上时自动隐藏。

Apple 无法在不重新启动登录会话的情况下切换 Spaces 设置,所以此时我什至不知道当屏幕有单独的 Spaces 时上述代码如何工作。我怀疑 [[NSScreen screens] firstObject] 仍然会包含左上角位于 (0,0) 的屏幕,因此其他屏幕上的全屏 windows 将继续显示菜单栏和 Dock。另外,我仍然是 运行 10.9,而且我也希望在以后的版本中也能立即正确使用它。

有没有办法确定以编程方式 Space 是如何配置的,或者知道给定的屏幕是否包含 menubar/Dock?谷歌搜索没有给我任何与从代码执行此操作相关的结果。不知何故,我在我的磁盘文档中遗漏了 [NSScreen +screensHaveSeparateSpaces],这是我问题的最终答案吗?

Is there a way to determine programmatically how Spaces are configured or to know whether a given screen contains the menubar/Dock? Googling didn't give me any results relevant to doing this from code. Somehow I missed [NSScreen +screensHaveSeparateSpaces] in my on-disk documentation, is that the definitive answer to my question?

是的。

顺便说一句,如果您的文档已过时,您可能会在文档中遗漏它,因为此方法是作为新空间模型的一部分引入的,但没有记录 - 它仅存在于头文件中。从那时到现在,文档赶上了。

NSScreen 有两个属性

frame

这是当前分辨率下的全屏矩形。此矩形包括当前被菜单栏和停靠栏占用的任何 space。

visibleFrame

这是定义当前可以安全绘制应用程序内容的屏幕部分的矩形。

返回的矩形始终基于当前的用户界面设置,不包括停靠栏和菜单栏当前占用的区域。因为它基于当前的用户界面设置,所以返回的矩形可以在调用之间更改,不应缓存。

即使启用停靠隐藏,此方法返回的矩形也可能小于全屏。系统使用一个小的边界区域来确定何时应该显示停靠栏。

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