Ответ Томми выше превосходен - я перенес его на Swift (для собственного использования) и размещаю здесь в качестве справки, но ответ Томми следует считать каноническим.
import Cocoa
public extension NSScreen {
var unitsPerInch: CGSize {
let millimetersPerInch:CGFloat = 25.4
let screenDescription = deviceDescription
if let displayUnitSize = (screenDescription[NSDeviceDescriptionKey.size] as? NSValue)?.sizeValue,
let screenNumber = (screenDescription[NSDeviceDescriptionKey("NSScreenNumber")] as? NSNumber)?.uint32Value {
let displayPhysicalSize = CGDisplayScreenSize(screenNumber)
return CGSize(width: millimetersPerInch * displayUnitSize.width / displayPhysicalSize.width,
height: millimetersPerInch * displayUnitSize.height / displayPhysicalSize.height)
} else {
return CGSize(width: 72.0, height: 72.0) // this is the same as what CoreGraphics assumes if no EDID data is available from the display device — https://developer.apple.com/documentation/coregraphics/1456599-cgdisplayscreensize?language=objc
}
}
}
if let screen = NSScreen.main {
print("main screen units per inch \(screen.unitsPerInch)")
}
Обратите внимание, что возвращаемое значение является своего рода фактически «точками на дюйм» (но не для всех определений; см. Ниже) и почти никогда не является «пикселями на дюйм» - современные компьютеры Mac имеют определенное количество пикселей. на точку, которая зависит от текущего параметра «Разрешение» в Системных настройках и внутреннего разрешения устройства (дисплеи Retina имеют намного больше пикселей).
Что вы знаете о возвращаемом значении, так это то, что если вы нарисуете линию с таким кодом, как
CGRect(origin: .zero, size: CGSize(width: 10, height: 1)).fill()
линия будет иметь высоту 1 / pointsPerInch.height
и ширину 1 / pointsPerInch.width
дюйма, если вы будете измерять ее очень точной линейкой, поднесенной к экрану.
(Долгое время графические фреймворки определяли «точку» как оба «1/72 дюйма в реальном мире» и также как «независимо от ширины или высоты коробки размером 1 x 1 оказывается на текущем мониторе с текущим разрешением - два определения, которые обычно конфликтуют друг с другом.)
Поэтому в этом коде я использую слово «единица измерения», чтобы пояснить, что мы имеем дело не с 1/72 дюйма и не с 1 физическим пикселем.
person
Wil Shipley
schedule
28.04.2019