有没有办法用英寸而不是点来定义视图的框架?
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
(以磅为单位)映射到整个物理宽度,高度也类似。
如果模式未拉伸,您将必须检查框架的纵横比和屏幕物理尺寸,以查看它是信箱式还是邮筒式。如果宽高比非常接近,则可能不是。这种情况类似于拉伸的情况,但宽度和高度映射应该是等效的。
如果纵横比差异很大,那么你就比较它们。如果屏幕的物理纵横比大于框架的纵横比,则屏幕的物理宽度大于模式正在使用的(邮筒式)。因此,您从两个高度计算从点到毫米的映射。如果物理纵横比小于逻辑纵横比,则模式为信箱模式,您使用宽度来计算映射。
在给定任何屏幕分辨率的情况下,有没有一种方法可以计算出一英寸的点数?例如,如果我想创建一个 8.5 英寸 x 11 英寸的 NSView
(就像一张纸的 sheet),是否有一种算法可以让我获得正确的点值frame
跨许多不同类型的 Mac 和屏幕分辨率?
这并不简单。我不确定有什么好方法。我可以提供一种方法,但我还没有确认这是否可靠:
首先,您可以使用 CGDisplayScreenSize()
获取屏幕的物理尺寸(以毫米为单位)。您可以从 NSScreen
获得屏幕的 CGDirectDisplayID
,反过来,您可以从 window 获得屏幕。获取屏幕的 deviceDescription
并获取 "NSScreenNumber"
键的值。这可能需要转换为 CGDirectDisplayID
.
这里的问题是显示模式可能无法填满屏幕。它可以是信箱或邮筒。或者,它可能会被拉伸。现在这种情况应该很少见,但仍有可能。您可以使用 CGDisplayCopyDisplayMode()
获取显示模式。要确定它是否被拉伸,您可以检查它的 ioFlags
以查看它们是否包含位掩码 kDisplayModeStretchedFlag
(在 IOKit 中声明)。
如果它被拉伸,屏幕的 frame
必须分别映射到 X 轴和 Y 轴的尺寸(以毫米为单位)。您假设屏幕的 frame.width
(以磅为单位)映射到整个物理宽度,高度也类似。
如果模式未拉伸,您将必须检查框架的纵横比和屏幕物理尺寸,以查看它是信箱式还是邮筒式。如果宽高比非常接近,则可能不是。这种情况类似于拉伸的情况,但宽度和高度映射应该是等效的。
如果纵横比差异很大,那么你就比较它们。如果屏幕的物理纵横比大于框架的纵横比,则屏幕的物理宽度大于模式正在使用的(邮筒式)。因此,您从两个高度计算从点到毫米的映射。如果物理纵横比小于逻辑纵横比,则模式为信箱模式,您使用宽度来计算映射。