如何在MacOS上获得物理显示分辨率?

时间:2018-12-03 13:39:02

标签: macos core-graphics appkit foundation

我正在寻找“关于本机”显示的值(在我的13英寸MBP上为2560 x 1600)。我尝试了CGDisplayBounds和NSScreen.main,它们都不返回这些值,而是返回使用的值内部用于渲染/测量。

根据Kens的建议:

let modes = CGDisplayCopyAllDisplayModes(CGMainDisplayID(), [kCGDisplayShowDuplicateLowResolutionModes: kCFBooleanTrue] as CFDictionary) as! [CGDisplayMode]

for mode in modes {
    let flags = String(format:"%02X", mode.ioFlags)
    print("\(mode.pixelWidth)x\(mode.pixelHeight) \(mode.width)x\(mode.height) 0x\(flags)")
}

输出为:

2560x1600 2560x1600 0x2000003 <- This would be the correct one
...
2880x1800 2880x1800 0x03 <- This one is the biggest 1x mode
...

因此,使用最大的1x会得到错误的结果。我将ioFlags添加到输出中。我相信这可能是缺少的链接;-)

谢谢Ken!

2 个答案:

答案 0 :(得分:1)

我认为最好的方法是枚举所有显示模式(包括1x模式)并找到a)一种ioFlags包含kDisplayModeNativeFlag的显示模式,或者,如果没有该标记,则b)最大的1x模式尺寸。

您将使用CGDisplayCopyAllDisplayModes()并传递一个字典,将键kCGDisplayShowDuplicateLowResolutionModes映射到kCFBooleanTrue作为options,以获取所有模式。您可以测试CGDisplayModeGetPixelWidth()等于CGDisplayModeGetWidth()以确定哪个是1x。

答案 1 :(得分:0)

NSScreen具有backingScaleFactor属性来检查比例