【问题标题】:Encoding / Serializing TTF Font file to NSData将 TTF 字体文件编码/序列化为 NSData
【发布时间】:2015-12-15 08:45:47
【问题描述】:

我正在尝试使用 mattt 的 UIFontSerialization 类 (here) 将一些 UIFont 对象转换为 NSData,以便能够序列化它们并将它们保存在 CoreData 或 Realm 数据库中,但我'我觉得它不能满足我的需要。

我正在尝试序列化 ttf 文件本身(我从 API 接收),因此我不需要将它们存储在用户的 Documents 目录或任何地方。这个想法是我的数据库存储了渲染字体所需的所有内容。

我在使用CTFontCopyTableCTFontRef 转换为CFDataRef 时遇到了麻烦。我正在这样做:

UIFont *originalFont = [UIFont fontWithName:@"Geometos" size:48];
CTFontRef fontRef = CTFontCreateWithName((__bridge CFStringRef)originalFont.fontName, originalFont.pointSize, NULL);
CFDataRef dataRef = CTFontCopyTable(fontRef, kCTFontTableCFF, kCTFontTableOptionNoOptions);
NSData *encodedFont = (__bridge_transfer NSData *)dataRef;

originalFont 很好,在我的包中,显示在标签等中。fontRef 也可以正确创建,不用担心。 dataRef 最终为零。如果我将表标签从CFF 切换到其他东西,它会编码,但后来当我将它解码回UIFont 时,它会失败,所以我想我需要使用CFF表(我不知道 CFF 代表什么)。

有人做过吗?将字体存储为序列化数据?

【问题讨论】:

  • 嘿,你有没有设法用CTFontCopyTable()kCTFontTableCFF 对字体进行编码?我现在遇到了这个问题,似乎无法让它工作

标签: ios serialization core-text uifont


【解决方案1】:

好的,我已经成功完成了这项工作,并与 Realm 数据库集成,而且非常快速!

简而言之,我从我的 API 中获取 ttf,将来自响应的原始数据作为 NSData 存储在我的 Realm 数据库中,检索它,然后使用以下方法将其转换为 UIFont 实例:

- (UIFont *)fontWithData:(NSData *)data size:(CGFloat)size {
    NSDate *before = [NSDate date];
    [UIFont familyNames]; // This prevents a known crash in CGDataProviderCreateWithCFData ?
    CGDataProviderRef fontDataProvider = CGDataProviderCreateWithCFData((CFDataRef)data);
    CGFontRef newFont = CGFontCreateWithDataProvider(fontDataProvider);
    NSString *newFontName = (__bridge NSString *)CGFontCopyPostScriptName(newFont);
    CGDataProviderRelease(fontDataProvider);
    CFErrorRef error;
    CTFontManagerRegisterGraphicsFont(newFont, &error);
    CGFontRelease(newFont);
    self.timeTakenToConvert = [[NSDate date] timeIntervalSinceDate:before];
    return [UIFont fontWithName:newFontName size:size];
}

认为这是可行的! :)

【讨论】:

    【解决方案2】:

    您可以将 fontNamefontSize 存储在数据库中,并在从数据库中获取后使用这些值创建 NSFont

    UIFont *font = [UIFont fontWithName:fontName size:fontSize];
    

    【讨论】:

    • 我正在尝试序列化字体本身,而不仅仅是对其名称和大小的引用,如果不清楚,请见谅。我的想法是我从我的 API 接收 TTF 字体,然后可以将它们序列化并存储它们,如果用户选择该字体,则对其进行解码。
    【解决方案3】:

    试试这个。

    UIFont *originalFont = [UIFont fontWithName:@"Arial" size:48];//Geometos
    NSData *data = [NSKeyedArchiver archivedDataWithRootObject:originalFont];
    NSFont *font = [NSKeyedUnarchiver unarchiveObjectWithData:data];
    NSLog(@"font:%@",font);
    

    【讨论】:

    • 对,但是如果我从手机中删除 Arial,我就无法从该数据中重建字体,可以吗?这就是我想要做的。
    • 你检查了吗,originalFont 返回 nil 值?那么你如何获得字体值 true 呢?
    • 请提供字体表
    • 它不是在建表,恐怕没有什么可提供的——这就是问题所在:)
    猜你喜欢
    • 2015-12-23
    • 1970-01-01
    • 2016-12-12
    • 1970-01-01
    • 2012-04-12
    • 2021-04-22
    • 2023-03-27
    • 2021-06-03
    • 2012-06-09
    相关资源
    最近更新 更多