Как получить физическое разрешение экрана на MacOS? - PullRequest
0 голосов
/ 03 декабря 2018

Я ищу, чтобы найти значение, которое "About this Mac" показывает (2560 x 1600 на моем 13 "MBP). Я пробовал CGDisplayBounds и NSScreen.main, оба не возвращают эти значения, а вместо этого возвращают то, что используетсявнутренний для рендеринга / измерения.

как по предложению Кенса:

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 приведет к неверному результату. Iдобавил ioFlags к выводу. Я полагаю, что это может отсутствующая ссылка; -)

Спасибо, Кен!

Ответы [ 2 ]

0 голосов
/ 04 января 2019

NSScreen имеет backingScaleFactor свойство для проверки масштаба

0 голосов
/ 03 декабря 2018

Я думаю, что лучший подход состоит в том, чтобы перечислить все режимы отображения (включая режимы 1x) и найти а) тот, чей ioFlags включает kDisplayModeNativeFlag, или, если ни у кого нет этого флага, b) самый большой режим 1xразмеры.

Вы должны использовать CGDisplayCopyAllDisplayModes() и передать словарь с ключом kCGDisplayShowDuplicateLowResolutionModes, сопоставленным с kCFBooleanTrue как options, чтобы получить все режимы.Вы можете проверить, что CGDisplayModeGetPixelWidth() равно CGDisplayModeGetWidth(), чтобы определить, какие из них 1x.

...