鉴于任何屏幕分辨率,有没有办法我可以计算出英寸的点数?例如,如果我想创建一个8.5英寸乘11英寸(像一张纸)的NSView
,是否有一种算法可以使我在许多不同的位置上获得frame
的正确点值Mac的类型和屏幕分辨率?
这并不简单。我不确定是否有一个好的方法。我可以提供一种方法,但是我还没有证实它可以可靠地工作:
首先,您可以使用CGDisplayScreenSize()
来获取屏幕的物理尺寸(以毫米为单位)。您可以从CGDisplayScreenSize()
中获取屏幕的CGDirectDisplayID
,然后可以从窗口中获取。获取屏幕的NSScreen
并获取deviceDescription
键的值。可能需要将其强制转换为"NSScreenNumber"
。
出现的问题是显示模式可能无法填满整个屏幕。它可以是有邮箱的或有邮箱的。或者,它可能会被拉伸。这些天这种情况很少见,但仍然可能。您可以使用CGDirectDisplayID
获得显示模式。要确定它是否被拉伸,可以检查其CGDisplayCopyDisplayMode()
以查看它们是否包含位掩码CGDisplayCopyDisplayMode()
(在IOKit中声明)。
如果被拉伸,则屏幕的ioFlags
必须分别针对X和Y轴以毫米为单位映射为其尺寸。您假定屏幕的kDisplayModeStretchedFlag
(以磅为单位)映射到整个物理宽度,并且高度也是如此。
如果未拉伸模式,则必须检查框架的宽高比和屏幕的物理尺寸,以查看其是否为字母或大写字母。如果宽高比非常接近,则可能不是。这种情况类似于拉伸的情况,但是宽度和高度映射应该等效。
如果宽高比相差很大,请进行比较。如果屏幕的物理纵横比大于框架的纵横比,则屏幕的物理宽度大于使用的模式(柱状框)。因此,您需要计算两个高度之间从点到毫米的映射。如果物理宽高比小于逻辑高宽比,则该模式将以字母框显示,并使用宽度来计算映射。