访问UIKit或CoreText中的OpenType功能

Kek*_*koa 7 uikit core-text ios

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

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

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

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

Kek*_*koa 7

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

答案是UIKit不支持在其框架内设置OpenType功能(在编写本文时),您必须下载到Core Text才能执行此操作,幸运的是,他们确实拥有一个公开其他字体功能的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);
Run Code Online (Sandbox Code Playgroud)

我在这里做的主要是使用CTFontDescriptorCreateCopyWithFeature()普通字体描述符和附加功能进行复制,在OpenType中它被称为"表格图",但在核心文本中,您将使用数字间距功能访问此功能(kNumberSpacingType),并设置在中定义的相应枚举的值<CoreText/SFNTLayoutTypes.h>.

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

enum {
  kMonospacedNumbersSelector    = 0,
  kProportionalNumbersSelector  = 1,
  kThirdWidthNumbersSelector    = 2,
  kQuarterWidthNumbersSelector  = 3
};
Run Code Online (Sandbox Code Playgroud)

所以诀窍是没有OpenType到CoreText功能的直接一对一映射,但看起来它们都存在,你只需要通过查看定义的常量来解决识别功能的痛苦在<CoreText/SFNTLayoutTypes.h>.

剩下的痛苦是你现在必须在Core Text中使用这种字体绘制文本,而不是更高级别的视图,但是有很多引用用于这样做.