如何缩放NSTextView以显示实际大小的富文本?

时间:2014-08-27 15:22:01

标签: cocoa scaling nstextview

NSTextView中的富文本显示在我的屏幕上(27&#34; Mac)比字体大小要小很多,虽然它打印正确,如果粘贴到另一个应用程序(例如OpenOffice),则是正确的大小。 TextEdit显示相同的行为。 <{1}}中的以下几行或多或少地确切地解决了这个问题。

awakeFromNib

因此看起来屏幕每英寸使用96点。如果我没有第二行,文本会略微被压扁,而monotext会被破坏。显然我不应该对比例因子进行硬编码,但在哪里可以找到放在那里的因素?从 [myTextView scaleUnitSquareToSize:NSMakeSize(96.0/72, 96.0/72)]; myTextView.layoutManager.usesScreenFonts = NO; (字典)我得到NSDeviceResolution = {72,72}&#34;,所以它似乎不是正在使用的。

1 个答案:

答案 0 :(得分:0)

我不确定这是明智的,但你可以从显示模式中获得“真正的”DPI:

CGDirectDisplayID displayID = [window.screen.deviceDescription[@"NSScreenNumber"] unsignedIntValue];
CGSize size = CGDisplayScreenSize(displayID);
CGDisplayModeRef mode = CGDisplayCopyDisplayMode(displayID);
NSSize dpi;
dpi.width = CGDisplayModeGetWidth(mode) * 25.4 / size.width;
dpi.height = CGDisplayModeGetHeight(mode) * 25.4 / size.height;
CGDisplayModeRelease(mode);

[myTextView scaleUnitSquareToSize:NSMakeSize(dpi.width/72, dpi.height/72)];
myTextView.layoutManager.usesScreenFonts = NO;

某些显示模式是letterboxed。这些可能永远不会被用作Mac GUI的一般模式;它们只能用于全屏游戏。但是,如果您希望应用程序处理此类模式,则应考虑到模式大小与一维中的全屏大小不对应并且上述DPI计算将关闭的事实。我认为没有直接的方法可以解决这个问题。您必须检查所有可用的显示模式,以查看相关属性(大小,像素编码等)中是否存在与当前模式相同但其IOKit标志指示它已拉伸(CGDisplayModeGetIOFlags(mode) & kDisplayModeStretchedFlag != 0)的当前模式模式不是。在这种情况下,您可能希望假设像素是正方形,并选择较小的dpi.widthdpi.height来用于两者。