[NSFont systemFontOfSize: weight:]的10.9替代方案是什么?

4
我希望实现一个替换方法,用于在Mac OS 10.9和10.10上工作的[NSFont systemFontOfSize:13 weight:NSFontWeightLight]
我可以通过[[NSFont systemFontOfSize:13] fontDescriptor]获取字体描述符。
然而,我无法弄清如何更改字体描述符的权重并从中创建NSFont。
正如WWDC 2015,#804:30:17所解释的那样,我们不应该从系统字体中获取系列名称(如此处此处建议的那样)。
是否有可能更改字体描述符的权重并从中获取新的NSFont?
2个回答

2
我能想到两种方法,但都不能完全与+[NSFont systemFontOfSize:weight:]提供的语义相同。
一种方法是使用-[NSFontManager convertWeight:ofFont:]。 它只允许您在字体重量上升或下降,而不是选择特定的目标权重。 但是,如果它提供一个新的字体,您可以查询-[NSFontManager weightOfFont:]以获取其权重,其中值3表示“轻”(请参见-convertWeight:ofFont:中的表)。 通过重复该过程,您可能能够获得所需的权重,尽管该方法可能失败或超过。
另一种方法是从字体到字体描述符再到具有所需权重的新字体描述符以及新字体:
NSFontDescriptor* origDescriptor = origFont.fontDescriptor;
NSFontDescriptor* newDescriptor = [origDescriptor fontDescriptorByAddingAttributes:@{ NSFontTraitsAttribute: @{ NSFontWeightTrait: @(-0.2) } }];
NSFont* newFont = [NSFont fontWithDescriptor:newDescriptor size:origFont.pointSize];

这里我随意选择了-0.2。这种方法的问题在于,它将权重值从-1.0到1.0作为取值范围,0表示"正常"。不清楚如何将该比例映射到"轻量级"。我想您可以通过名称查询一些轻量级字体,以了解它们的权重。


对于第二种方法,我们可以猜测使用-0.4作为“轻”字体的值,因为这是10.11提供的常量NSFontWeightLight所代表的值。 - Yoav
不幸的是,这两种方法都不起作用。它们都返回相同的原始字体。 - Yoav
你确定你要使用的字体有轻字重吗? - Ken Thomases
是的,它是HelveticaNeue UI版本的“常规”变体,从OS 10.10.4上的[NSFont systemFontWithSize:]检索,使用BaseSDK 11.11。 - Yoav

0

这可能不是唯一的答案,只是针对 OS X 10.10 的提示。在 OS X 10.10 下可以使用[NSFont systemFontOfSize: weight:],并且运行良好。虽然我没有在 10.9 下尝试过。我不确定我从哪里听说过这个方法与旧版本兼容。

我在 WWDC 上向一个 AppKit 工程师提问,他很惊讶我的应用程序在 10.10 下使用了新的 API。然而,他不建议我在 旧的系统(如 10.10)上使用该 API,因为它可能在后台使用私有 API,这将导致应用被 MAS 拒绝。


是的,关于iOS 8.2也提到了类似的事情。 - Yoav

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接