【问题标题】:Mac/Cocoa: how to determine if a window's screen has menubar and Dock?Mac/Cocoa:如何确定窗口的屏幕是否有菜单栏和 Dock?
【发布时间】:2017-09-16 20:30:25
【问题描述】:

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

我正在尝试编写一个传统的全屏切换功能,该功能应该在当前屏幕(监视器)上将窗口置于或退出全屏模式,同时不影响其他屏幕的内容 - 无论空间如何配置。

我已经让它适用于“传统”空间模式,其中每个空间跨越所有连接的屏幕。在这种情况下,主屏幕上只有 1 个菜单栏和 Dock,都可以通过 [[NSScreen screens] firstObject] 获得。因此,我可以做类似的事情

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

让 Dock 和菜单栏仅在全屏窗口位于主屏幕上时自动隐藏。

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

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

【问题讨论】:

  • 即使使用“传统”空间模式,Dock 也不一定在主屏幕上。它可以配置为显示在桌面的左侧或右侧,可以将其放在另一个屏幕上。
  • 嗯,你是对的。如果将辅助屏幕放在“主”屏幕下方,则将其放在底部也是如此。在这种情况下,您必须使用下面 Hofi 的方法,或者将 Dock 置于自动隐藏模式(暂时,如果可能的话)。
  • 我想知道这是否是一种常见的设置。当我需要在一个屏幕上工作一段时间(想想笔记本电脑)时,我会发现不将两个元素放在同一个屏幕上并且改变它们的相对位置会很烦人。这不适用于底部 Dock 和垂直堆叠的屏幕,但有多少人会这样做 :)
  • 我有双显示器,左侧是主显示器,右侧是 Dock。所以,这对我来说很常见。 ;)
  • 哈,这解释了你为什么想到它 :P 如果你的 Dock 在左侧屏幕上处于活动状态时自动隐藏你的 Dock 会不会介意,因为你知道你仍然可以通过 "用鼠标光标触摸”屏幕右边框?

标签: cocoa fullscreen multiple-monitors mission-control


【解决方案1】:

NSScreen 有两个属性

框架

这是当前分辨率下的全屏矩形。此矩形包括当前由菜单栏和停靠栏占用的所有空间。

可见帧

这是一个矩形,它定义了当前可以安全地在其中绘制应用程序内容的屏幕部分。

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

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

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

【讨论】:

  • 我早该想到的;它将为缺少[NSScreen +screensHaveSeparateSpaces] 的 10.9 之前的系统提供解决方案。但是等等,那些没有 2 种不一致的全屏模式 :) 还是谢谢。
  • 请注意,此方法在 Dock 隐藏时不起作用。
【解决方案2】:

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

是的。

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

【讨论】:

  • 谢谢。这似乎是“答案”,但得到确认很好:) 是的,我正在运行 10.9,我不确定通过 Xcode 提供的文档是否真的是最新的。我尽可能避免运行那个 IDE,大部分时间使用 Dash 克隆来浏览我的本地 API 文档。 (我真的很喜欢使用 Xcode 3.2.x,但后来的单片版本......不是那么多。)
猜你喜欢
  • 2011-06-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多