According to Apple,CGDisplayModeGetWidth()
和CGDisplayModeGetHeight()
都应该返回点而不是从macOS 10.8开始的像素。但Apple对这些API的说法并不一致,因为here他们说函数返回像素而不是点。
这种混淆也反映在实践中,因为这两种功能有时似乎只返回点,而不是所有时间。有时它们也会返回像素。考虑这个例子:
CGDirectDisplayID id = CGMainDisplayID();
CFArrayRef modes = CGDisplayCopyAllDisplayModes(id, NULL);
CGDisplayModeRef mode;
int c = 0, k, n;
n = CFArrayGetCount(modes);
for(k = 0; k < n; k++) {
mode = (CGDisplayModeRef) CFArrayGetValueAtIndex(modes, k);
printf("GOT SIZE: %d %d\n", (int) CGDisplayModeGetWidth(mode), (int) CGDisplayModeGetHeight(mode));
}
CFRelease(modes);
代码迭代所有可用的屏幕模式。在此示例中,输出以像素为单位。
但是,使用此代码时,输出为点:
CGDirectDisplayID id = CGMainDisplayID();
mode = CGDisplayCopyDisplayMode(id);
printf("NEW GOT SIZE: %d %d\n", (int) CGDisplayModeGetWidth(mode), (int) CGDisplayModeGetHeight(mode));
CGDisplayModeRelease(mode);
但为什么呢?为什么CGDisplayModeGetWidth()
和CGDisplayModeGetHeight()
会在第一个代码段中返回像素而在第二个代码段中返回?这让我很困惑。
为了使事情变得更加复杂,从macOS 10.8开始,有两个新的API,即CGDisplayModeGetPixelWidth()
和CGDisplayModeGetPixelHeight()
。这些总是返回像素,但我仍然不明白为什么CGDisplayModeGetWidth()
和CGDisplayModeGetHeight()
返回上面第一个代码段中的像素...这是一个错误吗?
修改
这是我的1680x1050显示器的输出。我正在使用Quartz Debug将显示器置于840x525屏幕模式下进行Retina测试。您可以看到第一个代码段的输出必须以像素为单位,因为它返回的模式如1680x1050,如果是点,则对应3360x2100像素。第一个代码片段返回像素而不是点的另一个证据在于,监视器当前所处的屏幕模式(即840x525)根本不返回。只有第二个代码段才会返回此模式。
GOT SIZE: 1680 1050
GOT SIZE: 1152 870
GOT SIZE: 1280 1024
GOT SIZE: 1024 768
GOT SIZE: 1024 768
GOT SIZE: 1024 768
GOT SIZE: 832 624
GOT SIZE: 800 600
GOT SIZE: 800 600
GOT SIZE: 800 600
GOT SIZE: 800 600
GOT SIZE: 640 480
GOT SIZE: 640 480
GOT SIZE: 640 480
GOT SIZE: 640 480
GOT SIZE: 1280 1024
GOT SIZE: 1280 960
GOT SIZE: 848 480
GOT SIZE: 1280 960
GOT SIZE: 1360 768
GOT SIZE: 800 500
GOT SIZE: 1024 640
GOT SIZE: 1280 800
GOT SIZE: 1344 1008
GOT SIZE: 1344 840
GOT SIZE: 1600 1000
--------------------------
NEW GOT SIZE: 840 525