CoreText是否支持Small Caps?

Lil*_*ard 13 core-text ios

CoreText是否有任何设施可用于选择字体的SmallCaps变体,或者如果字体没有该功能,则可以合成小型大写字母?我在CoreText文档中找不到任何关于小型大写的内容,尽管有处理字体变体/功能的工具.有人做过类似的事吗?

Lil*_*ard 10

答案似乎是合格的是.它支持具有小型大写字母功能的字体,但不支持在没有该功能的字体中合成小型大写字母.可以通过CTFontDescriptor使用kCTFontFeatureSettingsAttribute属性创建a来启用此功能,该属性映射到功能序列数组.该kCTFontFeatureTypeIdentifierKey密钥必须设置为3字母大小写,并且kCTFontFeatureSelectorIdentifierKey必须设置为3小型股.<ATS/SFNTLayoutTypes.h>包含标识各种值的常量,但iOS SDK中没有此标头.

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

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

请注意,Didot系列中的Italic/Bold字体不支持小型大写字母.


小智 6

它通常最容易使用CTFontDescriptorCreateCopyWithFeature.正如您在自己的回答中提到的,这仅适用于实际实现您请求的功能的字体.


Dim*_*ima 5

我决定在这里回答为试图解决这个问题的任何人提供更完整的解决方案,因为这里的信息不完整.

此解决方案使用iOS 7,UIFontDescriptor因为我现在不再支持iOS 6.

正如Anthony Mattox指出的那样,系统字体值(列为3和3但应该注意实际上是,kLetterCaseType并且kSmallCapsSelector不应该通过其编号引用枚举)将不适用于自定义字体.我不确定这是所有自定义字体的情况还是只是一些,但我发现这是我的情况.

在深入了解这两个枚举值的声明时,您实际上可以看到它们已被弃用,并且可能仅适用于支持小型大写的少数系统字体.在记录了Anthony所描述的自定义字体的可用属性后,我发现了2个用于自定义字体的正确属性.他们是kLowerCaseTypekLowerCaseSmallCapsSelector.我相信这种组合是唯一的其他选择,因此对于您尝试使用的任何字体,它将是一个或另一个.

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

- (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];
}
Run Code Online (Sandbox Code Playgroud)

您可以通过创建具有正确名称和大小的字体来使用它们,然后在其上调用其中一种方法,这将返回该字体的小型版本.您将需要找出正确的方法,以用于您决定使用的任何小型大写字体.

可能有一种聪明的方法可以通过检查可用类型来确定在运行时以编程方式使用哪一个(即使只是分析该字体属性数组的结果),但我没有费心去做,因为我只使用了一些不同的字体和手动检查适合我.

编辑:

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

与字母不同,支持系统字体和自定义字体看起来都是一样的.

您只需将此字典添加到上面的每个数组:

@{UIFontFeatureTypeIdentifierKey : @(kNumberCaseType),
                         UIFontFeatureSelectorIdentifierKey : @(kLowerCaseNumbersSelector)}
Run Code Online (Sandbox Code Playgroud)

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