BaseSDK从10.5改为10.6后出现字体粗细问题
-
12-11-2019 - |
题
将项目的 BaseSDK 更改为 10.6 后,我注意到我的自定义绘制文本看起来有所不同(查看图像:相同的绘图代码)
在 10.5 BaseSDK 下:图片1
在 10.6 BaseSDK 下:图片2
我正在使用 [(NSString *)myString drawInRect:myRect withAttributes:myAttributes] 进行绘图。
myAttributes = [[NSMutableDictionary alloc] initWithObjectsAndKeys:
[NSColor myColor], NSForegroundColorAttributeName,
[NSFont systemFontOfSize:18], NSFontAttributeName,
paragraphStyle, NSParagraphStyleAttributeName,
shadow, NSShadowAttributeName, nil];
造成这种差异的原因是什么,或者如何减小字体的粗细?我尝试通过以下方式减少厚度
[NSFontManager convertWeight:NO ofFont:font]
但看起来也好不了多少……
提前致谢。
解决方案 2
现在我知道它发生的原因和解决这个问题的修复: 似乎添加了10.6的Font LCD平滑选项,它在首选项中启用 - >外观 - >“在可用时使用LCD字体平滑”作为复选框,默认情况下。 这就是为什么改变项目的BaseSDK到10.6后,应用程序中的文本变得液晶平滑,看起来很糟糕。 因此,代码中的问题的修复是在图形之前更改图形上下文中的平滑选项:
CGContextRef context = [[NSGraphicsContext currentContext] graphicsPort];
CGContextSetShouldSmoothFonts(context, NO);
.
此方法的文档告诉我们,此参数是图形状态的一部分,因此如果您不想在其他字体图纸中更改此选项,则应恢复图形状态。
感谢@nsgod找到这个问题的原因。
其他提示
如果我们缩小并仔细观察两个图像,我们会注意到立即区别(至少我):
上部图像中的文本正在使用CRT样式的字体平滑,而较低图像中的文本使用中型LCD样式平滑。 (所有3个样式的LCD字体平滑将在抗锯齿像素中引入彩色投射)。
我们需要更多关于您的测试设置的信息,以便能够说出它会发生这种情况。在OS X的哪个版本下您正在测试它吗?例如,您的应用程序是否与10.6 SDK为10.5的部署目标为10.5,在OS X 10.5.x(在同一台机器上)进行测试时,拍摄上部图像,并且在测试下的10.6.x下进行较低的图像。 ?或者,在Mac OS X 10.6.x中完成所有测试,并且对10.5 SDK构建导致上部图像,并且对10.6 SDK构建导致较低的图像?您使用的是什么型号Mac?如果有的话,您已经挂钩了哪种外部LCD或CRT显示器?
只是几个想法,没有上面的信息要求。我认为默认字体平滑样式为10.5中的CRT,10.6默认为“自动”。因此,如果您有一个带有LCD显示器的系统并在10.5下测试,但从未从默认CRT样式中更改字体平滑样式,然后您将获得像上面的图像。如果您然后在同一系统上切换到10.6,则可以自动检测到10.6自动字体平滑,并使用介质LCD风格的字体平滑,从而导致较低图像中的“重视”文本。 。
要记住的另一件事是字体平滑值以逐个主机存储。例如,在我的机器上,AppleFontSmoothing
值存储在〜/ library / preferences / byhost / .globalpreferences中。##########。Plist,其中#########是您的硬件UUID。我认为可以有2个不同的主机设置可以存在2个不同的值。
你得到了你所要求的
[NSFont systemFontOfSize:18]
它们很可能是 10.5 和 10.6 之间略有不同的字体。一位平面设计师因为某种原因而发疯了。
如果您记录以下输出,您会得到什么 [NSFont systemFontOfSize:18]
. 。10.5和10.6有区别吗?