Objective c 如何读取OSX的物理屏幕大小?

Objective c 如何读取OSX的物理屏幕大小?,objective-c,macos,screen,dpi,Objective C,Macos,Screen,Dpi,我想知道MacOSX下的物理屏幕大小。但是NSDeviceResolution总是报告错误的值(72),因此分辨率/dpi的计算结果是错误的 在“关于这款Mac电脑”里面,有一个Mac型号的字符串,我的是“15英寸,2011年初”。所以我想知道是否应该有一种方法(可能在obj-c中)来读取该字符串,然后我可以使用它作为物理屏幕大小 非常感谢您的帮助。您可以使用以毫米为单位获取屏幕的物理大小。根据这一点,您可以计算DPI,因为您已经知道分辨率 例如 NSScreen *screen = [NSSc

我想知道MacOSX下的物理屏幕大小。但是
NSDeviceResolution
总是报告错误的值(72),因此分辨率/dpi的计算结果是错误的

在“关于这款Mac电脑”里面,有一个Mac型号的字符串,我的是“15英寸,2011年初”。所以我想知道是否应该有一种方法(可能在obj-c中)来读取该字符串,然后我可以使用它作为物理屏幕大小

非常感谢您的帮助。

您可以使用以毫米为单位获取屏幕的物理大小。根据这一点,您可以计算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

<> > <代码> @“NSlutStudio No..”/代码>看起来很狡猾,但是是从<代码> NScase中获得<代码> cgDistToDistId < /> >汤米>以上的答案是优秀的-我已经把它移植到SWIFT(我自己使用),并且张贴在这里作为参考,但是汤米的应该被认为是规范的。< /P>
导入可可粉
公共分机屏幕{
变量UnitsPrinch:CGSize{
设毫米间距:CGFloat=25.4
让屏幕描述=设备描述
如果让displayUnitSize=(屏幕描述[NSDeviceDescriptionKey.size]为?NSValue)?.sizeValue,
让screenNumber=(screenDescription[NSDeviceDescriptionKey(“NSScreenNumber”)]作为?NSNumber)?.UINT32值{
让displayPhysicalSize=CGDisplayScreenSize(屏幕编号)
返回CGSize(宽度:毫米Pernich*displayUnitSize.width/displayPhysicalSize.width,
高度:毫米Pernich*displayUnitSize.height/displayPhysicalSize.height)
}否则{
返回CGSize(宽度:72.0,高度:72.0)//这与CoreGraphics假设的相同,前提是显示设备没有可用的EDID数据-https://developer.apple.com/documentation/coregraphics/1456599-cgdisplayscreensize?language=objc
}
}
}
如果let screen=NSScreen.main{
打印(“每英寸主屏幕单位\(屏幕.单位打印)”)
}
请注意,返回的值实际上是“每英寸点数”(但不是所有定义;见下文),几乎从来没有“每英寸像素”——现代Mac电脑的每点像素数取决于系统首选项中的当前“分辨率”设置和设备的固有分辨率(视网膜显示器的像素要多得多)

关于返回值,您知道的是,如果您使用以下代码画一条线

如果您将非常精确的直尺举到屏幕上测量,线条将为
1/pointsPrinch.height
英寸高和
1/pointsPrinch.width
英寸宽

(长期以来,图形框架将“点”定义为“现实世界中的1/72英寸”和“以当前分辨率显示在当前显示器上的1 x 1单位的盒子的宽度或高度,这两个定义通常相互冲突。)


因此,对于这段代码,我使用了“单位”一词来说明我们没有处理1/72英寸,也没有处理1个物理像素。

只有一句话-NSDeviceSize包含以系统点为单位的大小,而不是物理像素。在视网膜显示器上(例如iMac 27 retina或新款macbook pro)系统点通常为2像素。因此,您必须将NSDeviceSize乘以[[NSScreen mainScreen]backingScaleFactor]才能获得物理像素。如果有人在macOS系统首选项->显示中设置“缩放”分辨率,则会更加混乱
CGRect(origin: .zero, size: CGSize(width: 10, height: 1)).fill()