访问UIKit或CoreText中的OpenTypefunction

我使用OpenType(.otf)格式的自定义字体,并希望使用该字体的一些OpenTypefunction 。

如何使用UIKit或CoreText实现这一目标? 我显然更喜欢UIKit,但是看看UIFont ,选项非常有限。

似乎完全没有关于iOS上OpenType支持的文档,除了可以使用字体格式。

相关阅读:Microsoft 对OpenTypefunction的参考 ,以及有关浏览器如何开始提供OpenTypefunction支持的一些信息。 虽然这个问题是在iOS上本地渲染具有OpenTypefunction的字体。

因为我所听到的只是在这个黑暗而寂寞的Core Text地方的蟋蟀,我想我会发布我自己找到的答案。

答案是UIKit不支持在其框架内设置OpenTypefunction(在撰写本文时),您必须下载到Core Text才能执行此操作,幸运的是,他们确实拥有一个公开其他字体function的API。

我不会详细介绍如何使用Core Text绘制文本,但相关的想法是你需要获得一个CTFontDescriptorRef来定义将用于绘制文本的字体的所有属性。

示例代码:

 CTFontDescriptorRef fontDescriptorNoFeatures = CTFontDescriptorCreateWithNameAndSize((__bridge CFStringRef)self.font.fontName, pointSize); // Set up OpenType Attributes CFAllocatorRef defaultAllocator = CFAllocatorGetDefault(); int numberSpacing = kNumberSpacingType; int numberSpacingType = kMonospacedNumbersSelector; CFNumberRef numberSpacingId = CFNumberCreate(defaultAllocator, kCFNumberIntType, &numberSpacing); CFNumberRef monospacedNumbersSelector = CFNumberCreate(defaultAllocator, kCFNumberIntType, &numberSpacingType); CTFontDescriptorRef fontDescriptor = CTFontDescriptorCreateCopyWithFeature(fontDescriptorNoFeatures, numberSpacingId, monospacedNumbersSelector); CFRelease(fontDescriptorNoFeatures); CFRelease(numberSpacingId); CFRelease(monospacedNumbersSelector); 

我在这里做的主要是使用正常字体描述符的CTFontDescriptorCreateCopyWithFeature()和附加function制作副本,在OpenType中它被称为“表格数字”,但在核心文本中你可以使用数字访问此function间距特征( kNumberSpacingType ),并设置定义的相应枚举的值。

对于数字间距function,枚举值(由于某种原因,他们称之为选择器!?!)是:

 enum { kMonospacedNumbersSelector = 0, kProportionalNumbersSelector = 1, kThirdWidthNumbersSelector = 2, kQuarterWidthNumbersSelector = 3 }; 

所以诀窍是没有OpenType到CoreTextfunction的直接一对一映射,但看起来它们都在那里,你只需要通过查看定义的常量来解决识别特征的痛苦在

剩下的痛苦是你现在必须用Core Text中的这个字体绘制文本,而不是更高级别的视图,但是有很多参考文献可以做到这一点。