And*_* Li 15 macos screen objective-c dpi
我想知道Mac OSX下的物理屏幕尺寸.但NSDeviceResolution总是报错值(72),因此分辨率/ dpi的计算结果是错误的.
在"关于这台Mac"里面,有一个Mac模型字符串,我的是"15英寸,2011年初".所以我想知道是否应该有一种方法(可能是obj-c),读取该字符串然后我可以将其用作物理屏幕大小.
任何帮助表示赞赏.
Tom*_*mmy 21
您可以使用CGDisplayScreenSize以毫米为单位获取屏幕的物理尺寸.由此您可以计算DPI,因为您已经知道了分辨率.
所以,例如
NSScreen *screen = [NSScreen mainScreen];
NSDictionary *description = [screen deviceDescription];
NSSize displayPixelSize = [[description objectForKey:NSDeviceSize] sizeValue];
CGSize displayPhysicalSize = CGDisplayScreenSize(
[[description objectForKey:@"NSScreenNumber"] unsignedIntValue]);
NSLog(@"DPI is %0.2f",
(displayPixelSize.width / displayPhysicalSize.width) * 25.4f);
// there being 25.4 mm in an inch
Run Code Online (Sandbox Code Playgroud)
那@"NSScreenNumber"件事看起来很狡猾,但却是明确的记录手段,CGDirectDisplayID从中获取NSScreen.
Tommy 上面的回答非常好——我已经将它移植到 Swift(供我自己使用)并在这里发布作为参考,但 Tommy 的应该被认为是规范的。
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)")
}
Run Code Online (Sandbox Code Playgroud)
请注意,返回的值是一种有效的“每英寸点数”(但不是所有的定义;见下文),几乎都不是“每英寸像素” -现代Mac电脑有许多每点的像素取决于当前系统偏好设置中的“分辨率”设置和设备的固有分辨率(Retina 显示器有更多像素)。
什么你不知道的返回值是,如果你画一条线与像代码
CGRect(origin: .zero, size: CGSize(width: 10, height: 1)).fill()
Run Code Online (Sandbox Code Playgroud)
如果你用一把非常精确的尺子举到你的屏幕上测量它,这条线将是1 / pointsPerInch.height几英寸高和1 / pointsPerInch.width几英寸宽。
(很长一段时间的图形框架已经定义了一个“点”为两个“在真实世界中的英寸的1/72”和也称为“一个盒子这是1×1单元最终被上的电流的宽度或高度的任何在当前分辨率下监控——通常相互冲突的两个定义。)
所以对于这段代码,我使用“单位”这个词来说明我们不是在处理 1/72 英寸,也不是 1 个物理像素。
| 归档时间: |
|
| 查看次数: |
6542 次 |
| 最近记录: |