10.9 replacement for [NSFont systemFontOfSize: weight:]



我想为[NSFont systemFontOfSize:13 weight:NSFontWeightLight]实现一个在Mac OS 10.9和10.10上工作的替代方法。

我可以通过[[NSFont systemFontOfSize:13] fontDescriptor]获得字体描述符。

然而,我不知道如何改变字体描述符的权重,并从它创建一个NSFont。

正如WWDC 2015, #804: 30:17所解释的,我们不应该从系统字体中取姓氏(如这里和这里所建议的)。

是否可以改变字体描述符的权重并从中获得新的NSFont ?

我可以想到两种方法,但都没有给出与+[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为"正常"值。目前尚不清楚如何将这一比例映射为"轻量级"。我想你可以查询一些轻字体的名称,看看他们的重量是多少。

这可能不是答案,只是OS X 10.10的一个提示。[NSFont systemFontOfSize: weight:]可以在OS X 10.10下使用并且工作良好。我没有在10.9下尝试过。我不确定我是从哪里听说的,但我认为这个方法是向后兼容旧版本的。

我在WWDC上问了一个AppKit工程师这个问题,他很惊讶我的应用可以在10.10下使用新的API。然而,他不建议我在旧的系统上使用API,比如10.10,因为它可能会在后台使用私有API,阻止应用程序被MAS接受。

相关内容

  • 没有找到相关文章

最新更新