是否可以用英寸而不是点来定义视图的框架?

问题描述 投票:0回答:1

鉴于任何屏幕分辨率,有没有办法我可以计算出英寸的点数?例如,如果我想创建一个8.5英寸乘11英寸(像一张纸)的NSView,是否有一种算法可以使我在许多不同的位置上获得frame的正确点值Mac的类型和屏幕分辨率?

swift macos frame nsview
1个回答
0
投票

这并不简单。我不确定是否有一个好的方法。我可以提供一种方法,但是我还没有证实它可以可靠地工作:

首先,您可以使用CGDisplayScreenSize()来获取屏幕的物理尺寸(以毫米为单位)。您可以从CGDisplayScreenSize()中获取屏幕的CGDirectDisplayID,然后可以从窗口中获取。获取屏幕的NSScreen并获取deviceDescription键的值。可能需要将其强制转换为"NSScreenNumber"

出现的问题是显示模式可能无法填满整个屏幕。它可以是有邮箱的或有邮箱的。或者,它可能会被拉伸。这些天这种情况很少见,但仍然可能。您可以使用CGDirectDisplayID获得显示模式。要确定它是否被拉伸,可以检查其CGDisplayCopyDisplayMode()以查看它们是否包含位掩码CGDisplayCopyDisplayMode()(在IOKit中声明)。

如果被拉伸,则屏幕的ioFlags必须分别针对X和Y轴以毫米为单位映射为其尺寸。您假定屏幕的kDisplayModeStretchedFlag(以磅为单位)映射到整个物理宽度,并且高度也是如此。

如果未拉伸模式,则必须检查框架的宽高比和屏幕的物理尺寸,以查看其是否为字母或大写字母。如果宽高比非常接近,则可能不是。这种情况类似于拉伸的情况,但是宽度和高度映射应该等效。

如果宽高比相差很大,请进行比较。如果屏幕的物理纵横比大于框架的纵横比,则屏幕的物理宽度大于使用的模式(柱状框)。因此,您需要计算两个高度之间从点到毫米的映射。如果物理宽高比小于逻辑高宽比,则该模式将以字母框显示,并使用宽度来计算映射。

© www.soinside.com 2019 - 2024. All rights reserved.