首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >`[NSScreen主屏幕]‘误导性文档

`[NSScreen主屏幕]‘误导性文档
EN

Stack Overflow用户
提问于 2019-05-23 05:35:52
回答 1查看 385关注 0票数 2

文档 for [NSScreen mainscreen]是误导性的。

主屏幕不一定与包含菜单栏的屏幕相同,也不一定原点为(0,0)。主屏幕是指包含当前正在接收键盘事件的窗口的屏幕。它是主屏幕,因为它是最有可能与用户交互的屏幕。

我试着:

代码语言:javascript
复制
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显示器上,确保它有键盘焦点,并执行:

代码语言:javascript
复制
0x1006aaac0 
0x1006aaac0    0.000000 0.000000 2560.000000 1440.000000  
0x1006ab3d0    0.000000 -800.000000 1280.000000 800.000000  

现在我把它拖到我的LCD上,确保它有键盘焦点,然后执行:

代码语言:javascript
复制
0x1005a15e0 
0x1005a15e0    0.000000 0.000000 2560.000000 1440.000000  
0x1005a64c0    0.000000 -800.000000 1280.000000 800.000000  

因此,[NSScreen mainscreen]每次都会识别液晶显示器(有菜单的液晶显示器)。

因此,与文档相反的是,[NSScreen mainscreen]实际上产生了带有菜单的屏幕。

有人愿意确认这是一个文档错误吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-05-23 05:54:51

Xcode窗口的位置和它有什么关系?查询它的程序可能不是Xcode本身,而是您的应用程序。

无论如何,这会受到系统首选项>任务控制>显示有不同空间的影响。另外,请参阅10.9 AppKit发行说明

空格和多屏幕 在10.9中,我们增加了一个特性,即每个屏幕都有自己的空间集,并且可以在一个屏幕上的空间之间切换,而不会干扰另一个屏幕上的空间。在这种模式下,全屏窗口使用一个屏幕,并保持任何其他屏幕的内容不变。 每个屏幕现在都有自己的菜单栏,只要您将Dock设置为“在底部的位置”,就可以在任何屏幕上显示Dock。 菜单栏在活动屏幕上具有活动外观,这通常是包含键窗口的屏幕。其他屏幕上的菜单栏具有不活动的外观。 在这种模式下,在活动屏幕上打开新窗口是可取的。为了支持这个模型,+NSScreen mainScreen现在返回活动屏幕,这与以前返回包含keyWindow (如果有的话)的屏幕和否则返回零屏幕的行为略有不同。 通过-restoreStateWithCoder:在应用程序启动时恢复的窗口将返回到以前的位置,不依赖于活动屏幕。使用-setFrameAutosaveName:定位的窗口将更喜欢活动显示。 此功能可以通过取消选中系统首选项中任务控制首选项窗格中名为“Display具有单独空间”的首选项来禁用。此设置仅在注销、返回或重新启动后生效。NSScreen有API来询问是否启用了单独的空间特性:

  • (BOOL)screensHaveSeparateSpaces NS_AVAILABLE_MAC(10_9); 当启用此功能时,windows可能不会显示明显的span。如果以编程方式将窗口置于跨越位置,则窗口将被分配到包含其大部分几何形状的显示中。如果用户移动窗口,窗口将被分配到包含鼠标的显示中。窗口剪辑到显示器的边缘,无论是否有另一个相邻的显示器。

不幸的是,许多重要的信息只出现在发布说明中。它并不总是包含在主要文档中。

注意,对+mainScreen的“旧”行为的解释略有不同

…它以前的行为是返回包含keyWindow的屏幕(如果有的话),否则返回零屏幕。

考虑一下,对于不活动的应用程序或没有窗口的应用程序,-[NSApplication keyWindow]将是nil,因此+mainScreen将返回零屏幕。因此,关于您引用的文档:

主屏幕是指包含当前正在接收键盘事件的窗口的屏幕。

没有说的是“在呼叫应用程序中”。

无论如何,如果您想要的是主显示器,在(0,0)处,只需使用NSScreen.screens[0]

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56268640

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档