2

在 Apple 的Apple Watch Design Resources中,有一个名为Alternate Font Weights and Italicizations的文档。在其中,它显示了默认字体的示例,其中应用了不同的属性,例如ItalicEmphasizedShort

假设我想使用与“Short”示例完全相同的字体。

  1. 有没有办法通过故事板为标签选择这种字体和样式?

  2. 在代码中,我将如何设置标签以使用此字体和样式?

4

1 回答 1

3

在一个 iOS 项目中,我尝试将正文字体 ( UIFontTextStyleBody) 修改为包含UIFontDescriptorTraitTightLeading. 当我阅读fontAttributes属性时,它报告NSFontNameAttribute.AppleSystemUIShortBody(原始值为.AppleSystemUIBody)。

由此,我能够弄清楚Apple的条款:

+------------+-----------------------------------+------------------------------+---------------------------------+
|    Term    |  UIFontDescriptorSymbolicTraits   |     NSFontNameAttribute      |    NSCTFontUIUsageAttribute     |
+------------+-----------------------------------+------------------------------+---------------------------------+
|            | (none)                            | .AppleSystemUIBody           | UICTFontTextStyleBody           |
| Italic     | UIFontDescriptorTraitItalic       | .AppleSystemUIItalicBody     | UICTFontTextStyleItalicBody     |
| Emphasized | UIFontDescriptorTraitBold         | .AppleSystemUIEmphasizedBody | UICTFontTextStyleEmphasizedBody |
| Short      | UIFontDescriptorTraitTightLeading | .AppleSystemUIShortBody      | UICTFontTextStyleShortBody      |
| Tall?      | UIFontDescriptorTraitLooseLeading | .AppleSystemUISpliceTallBody | UICTFontTextStyleTallBody       |
+------------+-----------------------------------+------------------------------+---------------------------------+

如果你尝试用UIFontDescriptorTraitExpanded, UIFontDescriptorTraitCondensed, UIFontDescriptorTraitVertical,做同样的事情UIFontDescriptorTraitUIOptimized,然后读取fontAttributes,它会返回与 Body 样式相同的值。如果你用 尝试同样的事情UIFontDescriptorTraitMonoSpace,它会返回一个nil字典。

因此,在 Apple Watch 项目中,您应该能够像这样使用Body Short Emphasized字体:

/*1*/ UIFontDescriptor *fontDescriptor = [UIFontDescriptor preferredFontDescriptorWithTextStyle:UIFontTextStyleBody];
/*2*/ fontDescriptor = [fontDescriptor fontDescriptorWithSymbolicTraits:UIFontDescriptorTraitTightLeading | UIFontDescriptorTraitBold];
/*3*/ UIFont *font = [UIFont fontWithDescriptor:fontDescriptor size:0];
/*4*/ [label setAttributedText:[[NSAttributedString alloc] initWithString:text attributes:@{NSFontAttributeName: font}]];

我说“应该”是因为这里有两个错误:

  • 在第 2 行,UIFontDescriptorTraitTightLeading正在指定,但在两个手表模拟器上都忽略了此特征。粗体和斜体工作得很好。
  • 在第 3 行,由于size设置为,它从[1]0获取其值。问题是在 38mm 设备上,和(在第 1 行使用)都存在错误。当用户不自定义字体大小时,两种方法都返回,在 38mm 设备上显然应该选择。(您可以通过在情节提要上放置一个标签,为其分配主体大小,并在视觉上将其与手动将其大小设置为 15 的标签进行比较来验证这一点。)UIFontDescriptorSizeAttributefontDescriptor +[UIFontDescriptor preferredFontDescriptorWithTextStyle:]-[UIFont preferredFontForTextStyle:]1615

注意:我正在运行 Xcode 6.2。

于 2015-04-08T00:40:11.753 回答