有没有办法用英寸而不是点来定义视图的框架?

Is there a way to define a view's frame in terms of inches instead of points?

在给定任何屏幕分辨率的情况下,有没有一种方法可以计算出一英寸的点数?例如,如果我想创建一个 8.5 英寸 x 11 英寸的 NSView(就像一张纸的 sheet),是否有一种算法可以让我获得正确的点值frame 跨许多不同类型的 Mac 和屏幕分辨率?

这并不简单。我不确定有什么好方法。我可以提供一种方法,但我还没有确认这是否可靠:

首先,您可以使用 CGDisplayScreenSize() 获取屏幕的物理尺寸(以毫米为单位)。您可以从 NSScreen 获得屏幕的 CGDirectDisplayID,反过来,您可以从 window 获得屏幕。获取屏幕的 deviceDescription 并获取 "NSScreenNumber" 键的值。这可能需要转换为 CGDirectDisplayID.

这里的问题是显示模式可能无法填满屏幕。它可以是信箱或邮筒。或者,它可能会被拉伸。现在这种情况应该很少见,但仍有可能。您可以使用 CGDisplayCopyDisplayMode() 获取显示模式。要确定它是否被拉伸,您可以检查它的 ioFlags 以查看它们是否包含位掩码 kDisplayModeStretchedFlag(在 IOKit 中声明)。

如果它被拉伸,屏幕的 frame 必须分别映射到 X 轴和 Y 轴的尺寸(以毫米为单位)。您假设屏幕的 frame.width(以磅为单位)映射到整个物理宽度,高度也类似。

如果模式未拉伸,您将必须检查框架的纵横比和屏幕物理尺寸,以查看它是信箱式还是邮筒式。如果宽高比非常接近,则可能不是。这种情况类似于拉伸的情况,但宽度和高度映射应该是等效的。

如果纵横比差异很大,那么你就比较它们。如果屏幕的物理纵横比大于框架的纵横比,则屏幕的物理宽度大于模式正在使用的(邮筒式)。因此,您从两个高度计算从点到毫米的映射。如果物理纵横比小于逻辑纵横比,则模式为信箱模式,您使用宽度来计算映射。