CoreText是否支持Small Caps?

CoreText是否具有selectSmallCaps字体变体的function,或者在字体没有该function的情况下合成小型大写字母? 我在CoreText文档中找不到任何关于小型大写字母的内容,尽pipe有处理字体变化/function的工具。 有没有人做过类似的事情?

使用CTFontDescriptorCreateCopyWithFeature通常是最简单的。 正如你在自己的答案中提到的,这只适用于实际实现你请求的function的字体。

答案似乎是合格的是的。 它支持具有“小型大小写”function的字体,但不支持以不具有此function的字体合成小型大写字母。 可以通过创buildCTFontDescriptor来启用此function,其中kCTFontFeatureSettingsAttribute属性映射到特征字典数组。 对于kCTFontFeatureTypeIdentifierKey字母, kCTFontFeatureTypeIdentifierKey键必须设置为3,对于kCTFontFeatureSelectorIdentifierKey字母, kCTFontFeatureSelectorIdentifierKey必须设置为3。 <ATS/SFNTLayoutTypes.h>包含标识各种值的常量,尽pipe此标头在iOS SDK中不可用。

在iPad上可用的字体中,以下支持Small Caps:

  • HoeflerText正规
  • HoeflerText斜体
  • HoeflerText黑
  • HoeflerText-BlackItalic
  • 狄多

请注意,Didot系列中的斜体/粗体字体不支持小写字母。

我决定在这里回答,以提供一个更完整的解决scheme,任何人试图解决这个问题,因为这里的信息是不完整的。

此解决scheme使用iOS 7 UIFontDescriptor因为我现在正在放弃对iOS 6的支持。

正如Anthony Mattox所指出的那样,系统字体值(它们被列为3和3,但应该被注意到实际上是kLetterCaseTypekSmallCapsSelector ,你不应该通过它的数字来引用枚举),对于自定义字体将不起作用。 我不知道这是所有自定义字体还是仅仅是一些,但我发现这是我的情况。

挖掘这两个枚举值的声明时,实际上可以看到它们已被弃用,并且大概只能用于less数支持小型大写字母的系统字体。 在loggingAnthony自定义字体的可用属性之后,我find了2个用于自定义字体的正确属性。 他们是kLowerCaseTypekLowerCaseSmallCapsSelector 。 我相信这个组合是唯一的select,所以对于任何你尝试使用的字体来说,它将是一个或另一个。

我写了一些类别方法来封装这两种情况下的function:

 - (UIFont *) smallCapSystemFont { UIFontDescriptor *descriptor = [self fontDescriptor]; NSArray *array = @[@{UIFontFeatureTypeIdentifierKey : @(kLetterCaseType), UIFontFeatureSelectorIdentifierKey : @(kSmallCapsSelector)}]; descriptor = [descriptor fontDescriptorByAddingAttributes:@{UIFontDescriptorFeatureSettingsAttribute : array}]; return [UIFont fontWithDescriptor:descriptor size:0]; } - (UIFont *) smallCapCustomFont { UIFontDescriptor *descriptor = [self fontDescriptor]; NSArray *array = @[@{UIFontFeatureTypeIdentifierKey : @(kLowerCaseType), UIFontFeatureSelectorIdentifierKey : @(kLowerCaseSmallCapsSelector)}]; descriptor = [descriptor fontDescriptorByAddingAttributes:@{UIFontDescriptorFeatureSettingsAttribute : array}]; return [UIFont fontWithDescriptor:descriptor size:0]; } 

您可以通过创build一个正确的名称和大小的字体,然后调用其中的一个方法来使用这些字体,这将返回一个小字体的字体版本。 您将需要找出正确的方法来使用您决定使用的任何小写字母的字体。

通过检查可用的types(甚至通过分析字体属性数组的结果),可能有一个聪明的方法来确定在运行时以编程方式使用哪一个,但是我并没有打扰,因为我只使用了一些不同的字体和手动检查适合我。

编辑:

我注意到的一件事是数字是分开处理的。 如果你希望数字也被小写(在大多数支持它的字体的情况下,实际上它似乎被称为“旧式数字”),你将需要明确地作为一个属性。

看起来像支持系统字体和自定义字体是相同的,不像字母。

你只需要将这个字典添加到上面的每个数组中:

 @{UIFontFeatureTypeIdentifierKey : @(kNumberCaseType), UIFontFeatureSelectorIdentifierKey : @(kLowerCaseNumbersSelector)} 

再一次,为了这个工作,字体本身实际上需要支持这个属性。

扩展凯文·巴拉德的答案。 值“3”和“3”适用于系统字体,但似乎并不普遍。 我正在使用外部字体,这些值不起作用。

你可以用这样的东西注销所有可用的属性:

 UIFont *font = [UIFont fontWithName: fontName size: fontSize]; CFArrayRef fontProperties = CTFontCopyFeatures ( ( __bridge CTFontRef ) font ) ; NSLog(@"properties = %@", fontProperties); CFRelease(fontProperties); 

并确定您需要启用小写字母或其他字体function的字体function和select器。