文档 for [NSScreen mainscreen]是误导性的。
主屏幕不一定与包含菜单栏的屏幕相同,也不一定原点为(0,0)。主屏幕是指包含当前正在接收键盘事件的窗口的屏幕。它是主屏幕,因为它是最有可能与用户交互的屏幕。
我试着:
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]每次都会识别液晶显示器(有菜单的液晶显示器)。
因此,与文档相反的是,[NSScreen mainscreen]实际上产生了带有菜单的屏幕。
有人愿意确认这是一个文档错误吗?
发布于 2019-05-23 05:54:51
Xcode窗口的位置和它有什么关系?查询它的程序可能不是Xcode本身,而是您的应用程序。
无论如何,这会受到系统首选项>任务控制>显示有不同空间的影响。另外,请参阅10.9 AppKit发行说明
空格和多屏幕 在10.9中,我们增加了一个特性,即每个屏幕都有自己的空间集,并且可以在一个屏幕上的空间之间切换,而不会干扰另一个屏幕上的空间。在这种模式下,全屏窗口使用一个屏幕,并保持任何其他屏幕的内容不变。 每个屏幕现在都有自己的菜单栏,只要您将Dock设置为“在底部的位置”,就可以在任何屏幕上显示Dock。 菜单栏在活动屏幕上具有活动外观,这通常是包含键窗口的屏幕。其他屏幕上的菜单栏具有不活动的外观。 在这种模式下,在活动屏幕上打开新窗口是可取的。为了支持这个模型,+NSScreen mainScreen现在返回活动屏幕,这与以前返回包含keyWindow (如果有的话)的屏幕和否则返回零屏幕的行为略有不同。 通过-restoreStateWithCoder:在应用程序启动时恢复的窗口将返回到以前的位置,不依赖于活动屏幕。使用-setFrameAutosaveName:定位的窗口将更喜欢活动显示。 此功能可以通过取消选中系统首选项中任务控制首选项窗格中名为“Display具有单独空间”的首选项来禁用。此设置仅在注销、返回或重新启动后生效。NSScreen有API来询问是否启用了单独的空间特性:
不幸的是,许多重要的信息只出现在发布说明中。它并不总是包含在主要文档中。
注意,对+mainScreen的“旧”行为的解释略有不同
…它以前的行为是返回包含keyWindow的屏幕(如果有的话),否则返回零屏幕。
考虑一下,对于不活动的应用程序或没有窗口的应用程序,-[NSApplication keyWindow]将是nil,因此+mainScreen将返回零屏幕。因此,关于您引用的文档:
主屏幕是指包含当前正在接收键盘事件的窗口的屏幕。
没有说的是“在呼叫应用程序中”。
无论如何,如果您想要的是主显示器,在(0,0)处,只需使用NSScreen.screens[0]。
https://stackoverflow.com/questions/56268640
复制相似问题