访问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中的这个字体绘制文本,而不是更高级别的视图,但是有很多参考文献可以做到这一点。
- 正确的方式使用UINavigationController的initWithNavigationBarClass:toolbarClass:
- iOS – UITextView + NSUndoManager
- 如何使用MPMediaPickerController得到mp3的NSData?
- 使用IPv6和Azure的iOS问题
- tableView单元格有时显示错误的图像?
- validationappReceiptStoreURL返回21002状态
- 检查NSData是否包含ASCII或UTF8编码
- 蓝色横幅“%MyApp%正在使用您的位置”仅适用于在活动状态下使用位置服务的应用
- 无法加载捆绑UITests,因为它已损坏或缺少必要的资源。 尝试重新安装捆绑包