- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
documentation [NSScreen mainscreen]
具有误导性。
The main screen is not necessarily the same screen that contains the menu bar or has its origin at (0, 0). The main screen refers to the screen containing the window that is currently receiving keyboard events. It is the main screen because it is the one with which the user is most likely interacting.
我尝试:
printf( "%p \n", [NSScreen mainScreen]);
for( NSScreen* sc in [NSScreen screens] ) {
NSRect f = [sc frame];
printf("%p %f %f %f %f \n", sc, f.origin.x, f.origin.y, f.size.width,f.size.height );
}
我将我的 Xcode 窗口拖到我的原生 MacBook 显示器上,确保它有键盘焦点,然后执行:
0x1006aaac0
0x1006aaac0 0.000000 0.000000 2560.000000 1440.000000
0x1006ab3d0 0.000000 -800.000000 1280.000000 800.000000
现在我将它拖到我的 LCD 上,确保它有键盘焦点,然后执行:
0x1005a15e0
0x1005a15e0 0.000000 0.000000 2560.000000 1440.000000
0x1005a64c0 0.000000 -800.000000 1280.000000 800.000000
所以 [NSScreen mainscreen]
每次都识别 LCD(带有菜单栏的那个)。
看来 [NSScreen mainscreen]
,与文档相反,实际上确实产生了带有菜单栏的屏幕。
有人愿意确认这是文档错误吗?
最佳答案
Xcode的窗口的位置跟它有什么关系呢?查询它的程序可能不是 Xcode 本身,而是您的应用程序。
无论如何,这受“系统偏好设置”>“任务控制”>“显示有单独的空间”的影响。另请参阅 10.9 AppKit release notes :
Spaces and Multiple Screens
In 10.9, we have added a feature where each screen gets its own set of spaces, and it is possible to switch between spaces on one screen without perturbing the spaces on the other screens. In this mode, a fullscreen window uses one screen, and leaves the contents of any other screens unchanged.
Each screen now has its own menu bar, and it is possible to show the Dock on any screen, provided you have the Dock set to “Position on Bottom”.
The menu bar has an active appearance on the active screen, which is typically the screen containing the key window. Menu bars on other screens have an inactive appearance.
In this mode, it is desirable for new windows to open on the active screen. In support of this model, +[NSScreen mainScreen] now returns the active screen, which is slightly different than its prior behavior of returning the screen containing the keyWindow, if any, and the zero screen otherwise.
A window restored at app launch through -restoreStateWithCoder: will return to its previous location, independent of active screen. A window positioned using -setFrameAutosaveName: will prefer the active display.
This feature can be disabled by unchecking the preference named “Displays have Separate Spaces” in the Mission Control preference pane in System Preferences. This setting only takes effect after logging out and back in, or restarting. NSScreen has API to query whether the separate space feature is enabled:
+ (BOOL)screensHaveSeparateSpaces NS_AVAILABLE_MAC(10_9);
When this feature is enabled, windows may not visibly span displays. A window will get assigned to the display containing the majority of its geometry if programmatically positioned in a spanning position. A window will get assigned to the display containing the mouse if the window is moved by the user. A window clips to the edge of the display, whether or not there is another adjacent display.
遗憾的是,许多重要信息仅在发行说明中。它并不总是包含在主要文档中。
请注意对 +mainScreen
的“旧”行为的稍微不同的解释:
… its prior behavior of returning the screen containing the keyWindow, if any, and the zero screen otherwise.
考虑到,对于一个不活动的应用程序或没有窗口的应用程序,-[NSApplication keyWindow]
将是 nil
,因此 +mainScreen
将返回零屏幕。因此,引用您引用的文档:
The main screen refers to the screen containing the window that is currently receiving keyboard events.
没有说的是“在调用应用程序中”。
无论如何,如果您想要的是主显示器,即 (0, 0) 处的显示器,只需使用 NSScreen.screens[0]
。
关于objective-c - `[NSScreen mainscreen]` 误导文档,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56268640/
我的 Mac 设置是这样的:5K 显示屏排列在 Mac 内置显示屏的顶部。 如果我的鼠标光标位于 5K 显示屏上,并且我尝试像这样获取鼠标位置: CGEventRef ourEvent = CGEve
我正在开发一个项目,其中每个显示器都有设置。我希望我的应用程序支持删除显示器并稍后重新添加显示器,可能在其间使用另一个显示器,并在再次看到显示器时应用每个显示器的原始设置。 据我所知,没有办法通过 N
这是我的 NSWindow 的构造函数子类名为 FullScreenWindow : - (id)initWithScreen:(NSScreen *)s { NSRect contentRect =
我试图创建一个停靠在屏幕顶部、OS X 菜单栏下方的工具栏。 我不希望其他应用程序在最大化时能够与我的应用程序重叠。我可以使用 NSScreen 的visibleframe 方法获取可见框架尺寸,但是
我有一个应用程序,它将根据按下的按钮加载几个窗口。除其中之一外,所有这些都在主屏幕(打开主窗口的屏幕)上打开。其中一个(首选项窗口)在第一个屏幕(带有菜单栏的屏幕)上打开。我无法理解它是如何做到这一点
documentation [NSScreen mainscreen] 具有误导性。 The main screen is not necessarily the same screen that c
documentation [NSScreen mainscreen] 具有误导性。 The main screen is not necessarily the same screen that c
我正在编写一个应用程序来操纵窗口位置并添加多显示器支持。 为此,我有“本地”窗口位置(相对于 NSScreen 的框架),我需要将其转换为“全局”窗口位置(相对于指定所有监视器位置的位置,我相信它是
在 Cocoa/AppKit 中,给定一个来自 [NSScreen screens] 的屏幕,我如何才能知道该特定屏幕上是否正在运行全屏应用程序?我最感兴趣的是使用 Cocoa API 进行全屏显示的
我正在制作一个应用程序,它将在 Mac 上的实时屏幕上添加水印。我应该选择哪个 API?我尝试了 NSScreen 但没有找到任何可以向 NSScreen 添加 View 的方法。 像Mac Apps
这是我在调试应用程序时观察到的情况。我的应用程序本质上是一个单线程应用程序。 应用程序最初只有一个线程。 线程 1:队列:com.apple.main-thread。 在我的应用程序中,当点击以下代码
获取最有可能是投影仪或 AirPlay 显示器的 NSScreen 实例的最佳方式是什么? (甚至电视输出?)我正在编写一个演示软件,需要知道哪个屏幕最有可能代表“演示”屏幕。 我想到了一些选择: A
我需要在外部屏幕上显示一个窗口(例如连接到 Macbook 的显示器)。但我不知道如何区分内部 MacBook 屏幕和外部屏幕。调用 NSScreen.screens() 返回所有屏幕的列表,在我的例
我想获取主屏幕的尺寸,所以我使用这个片段: NSLog(@"mainScreen frame = %@", [[NSScreen mainScreen] visibleFrame]); 正在打印 ma
这个问题在这里已经有了答案: How to get resolution change event in swift? (4 个答案) 关闭 5 年前。 我正在制作一个带有 float 窗口的 Co
我在清理 CATextLayer 时遇到问题。对于 iOS,解决方案是: textLayer.contentsScale = UIScreen.mainScreen.scale 但我在 cocoa N
如果我的 MacBook 连接了外接显示器,我该如何找回 MacBook 屏幕? 其中一个屏幕可以是带有菜单栏和扩展坞的屏幕。它们也可以具有相同的分辨率、相同的名称等。 是否可以在不要求用户拔掉除 M
使用 [NSScreen screens] 我能够获得连接到计算机的所有屏幕及其尺寸,但是我试图找出它们之间的相对位置(如显示首选项中的排列)。有没有办法做到这一点?我在网上查看并浏览了 Apple
macOS 10.15+ 提供 NSScreen.localizedName ,它为屏幕提供面向用户的名称,例如“内置 Retina 显示屏”或“Встроенный дисплей Retina”(
我是一名优秀的程序员,十分优秀!