Objective c 如何查询视网膜硬件中的物理像素数?

Objective c 如何查询视网膜硬件中的物理像素数?,objective-c,macos,screen-resolution,retina-display,Objective C,Macos,Screen Resolution,Retina Display,我正在寻找一种获取两条信息的方法:(1)显示器的完整物理分辨率,即使是视网膜屏幕;(2) 根据当前系统设置,操作系统将假装具有相同屏幕的分辨率。到目前为止,我能得到(2),但不能得到(1)。看来我遇到了这样的评论 如果有人在macOS系统首选项->显示中设置“缩放”分辨率,则会更加混乱 没有找到任何关于如何在“混乱”中导航的信息。到目前为止,我使用clang-framework Cocoa-x objective-c-o grokResolution编译了以下内容: #import <Ap

我正在寻找一种获取两条信息的方法:(1)显示器的完整物理分辨率,即使是视网膜屏幕;(2) 根据当前系统设置,操作系统将假装具有相同屏幕的分辨率。到目前为止,我能得到(2),但不能得到(1)。看来我遇到了这样的评论

如果有人在macOS系统首选项->显示中设置“缩放”分辨率,则会更加混乱

没有找到任何关于如何在“混乱”中导航的信息。到目前为止,我使用
clang-framework Cocoa-x objective-c-o grokResolution
编译了以下内容:

#import <AppKit/AppKit.h>

void ReportRect(CGRect rect, const char *description)
{
    printf("{'x': % 5g, 'y':% 5g, 'width':% 5g, 'height':% 5g, 'name':'%s'}\n",
        rect.origin.x, rect.origin.y,
        rect.size.width, rect.size.height,
        description);
}

int main(int argc, char** argv)
{
    NSScreen *screen = [[NSScreen screens] objectAtIndex:0];

    CGRect looksLike = [screen frame];
    CGRect backing = [screen convertRectToBacking:looksLike];

    ReportRect(looksLike, "looksLike");
    ReportRect(backing, "backing");
    printf("{'backingScaleFactor' : %0.2f}\n", [screen backingScaleFactor]);
}
所以这似乎是正确的。但是,如果我单击系统首选项右侧的下一个缩放设置,然后重新运行程序,我会得到:

{'x':     0, 'y':    0, 'width': 1440, 'height':  900, 'name':'looksLike'}
{'x':     0, 'y':    0, 'width': 2880, 'height': 1800, 'name':'backing'}
{'backingScaleFactor' : 2.00}
现在,虽然系统首选项的“外观”设置似乎正确地反映在
[screen frame]
的输出中,我对整个系统的理解显然有缺陷,因为我期望
backingScaleFactor
和/或
convertRecttoBack
能够正确地从假物理分辨率转换为真物理分辨率。当系统首选项更改时,
backingScaleFactor
似乎没有正确调整。在这种情况下,转换返回的像素比我的硬件实际拥有的像素多

如何正确转换?或者有没有其他更直接的方法来查询显示器的实际物理像素数


(我知道
system_profiler SPDisplaysDataType | grep Resolution
,但我需要一个能够在现有obj-C源代码中工作的解决方案。)

比例因子始终是整数。到目前为止,它总是1或2。总有一天,苹果可能会推出3倍于macOS的显示器支持

后备存储器不一定对应于物理显示像素。对于某些“缩放”分辨率,备份存储大于物理显示像素数。然后按比例缩小以实际显示。这就是你的第二个例子


至于如何获得物理显示像素的数量,最近有几个问题对此进行了讨论,但没有确定的答案。请参阅和评论中的链接。

说到底,我的问题可能是你链接到的问题的翻版。谢谢你花时间来纠正我的一些误解,而不仅仅是重新定位。不客气。关于物理像素和备份存储之间的区别的部分是为什么我没有将其标记为重复。这是值得单独回答的。
{'x':     0, 'y':    0, 'width': 1440, 'height':  900, 'name':'looksLike'}
{'x':     0, 'y':    0, 'width': 2880, 'height': 1800, 'name':'backing'}
{'backingScaleFactor' : 2.00}