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,但应该被注意到实际上是kLetterCaseType
和kSmallCapsSelector
,你不应该通过它的数字来引用枚举),对于自定义字体将不起作用。 我不知道这是所有自定义字体还是仅仅是一些,但我发现这是我的情况。
挖掘这两个枚举值的声明时,实际上可以看到它们已被弃用,并且大概只能用于less数支持小型大写字母的系统字体。 在loggingAnthony自定义字体的可用属性之后,我find了2个用于自定义字体的正确属性。 他们是kLowerCaseType
和kLowerCaseSmallCapsSelector
。 我相信这个组合是唯一的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器。