如何动态下载字体并将其安装到 iOS 应用程序

2024-01-06

客户希望通过 API 调用下载字体来动态地将字体添加到 iOS 应用程序中。

这可能吗?我挖掘出的所有资源都展示了如何手动将 .ttf 文件拖到 Xcode 并将其添加到 plist 中。是否可以下载字体并以编程方式在客户端上使用它?

Thanks.


好的,这就是我的做法。首先在需要的地方执行此操作:

#import <CoreText/CoreText.h>

然后进行 NSURLSession 调用。我的客户将字体上传到 Amazon S3。因此,在需要的地方执行此操作:

// 1
NSString *dataUrl = @"http://client.com.s3.amazonaws.com/font/your_font_name.ttf";
NSURL *url = [NSURL URLWithString:dataUrl];

// 2
NSURLSessionDataTask *downloadTask = [[NSURLSession sharedSession] dataTaskWithURL:url completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {
    // 4: Handle response here
    if (error == nil) {
        NSLog(@"no error!");
        if (data != nil) {
            NSLog(@"There is data!");
            [self loadFont:data];
        }
    } else {
        NSLog(@"%@", error.localizedDescription);
    }
}];

// 3
[downloadTask resume];

我的 loadFont 数据在这里:

- (void)loadFont:(NSData *)data
{
    NSData *inData = data;
    CFErrorRef error;
    CGDataProviderRef provider = CGDataProviderCreateWithCFData((CFDataRef)data);
    CGFontRef font = CGFontCreateWithDataProvider(provider);
    if(!CTFontManagerRegisterGraphicsFont(font, &error)){
        CFStringRef errorDescription = CFErrorCopyDescription(error);
        NSLog(@"Failed to load font: %@", errorDescription);
        CFRelease(errorDescription);
    }
    CFRelease(font);
    CFRelease(provider);

    [self fontTest];
}

最后的 fontTest 只是为了确保字体确实存在,就我而言,它确实存在!而且,当应用程序在需要的地方运行时它就会出现。

- (void)fontTest
{
    NSArray *fontFamilies = [UIFont familyNames];
    for (int i = 0; i < [fontFamilies count]; i++) {
        NSString *fontFamily = [fontFamilies objectAtIndex:i];
        NSArray *fontNames = [UIFont fontNamesForFamilyName:[fontFamilies objectAtIndex:i]];
        NSLog (@"%@: %@", fontFamily, fontNames);
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何动态下载字体并将其安装到 iOS 应用程序 的相关文章

随机推荐

  • 使用 JavaDoc 记录 Map 的标准方法是什么?

    我正在记录一些代码 并且我有一个私有 HashMap 我想指定有关键和值的期望信息 现在我有 HashMap where key word value part of speech private HashMap
  • Helm 图表中的多个环境变量

    我创建了常见的舵图 在值 yml文件中 我有一组环境变量需要设置为deployment yaml 文件的一部分 值文件的片段 env name ABC value 123 name XYZ value 567 name PQRS value
  • Python:urllib.error.HTTPError:HTTP 错误 404:未找到

    我编写了一个脚本来查找 SO 问题标题中的拼写错误 我用了大约一个月 效果很好 但现在 当我尝试运行它时 我得到了这个 Traceback most recent call last File copyeditor py line 32 i
  • 我有 Godaddy 共享虚拟主机 我需要托管 node.js 网站,可以托管网站吗? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 任何人都有想法托管一个网站或参考如何在 Godaddy 上安装节点服务器 我们有 Godaddy 共享主机 它提供完整的 Cpanel
  • 为什么我应该使用 url.openStream 而不是 url.getContent?

    我想检索 url 的内容 与蟒蛇相似 html content urllib urlopen http www test com test html read 在示例中 java2s com http www java2s com Tuto
  • 为什么要在 PHP 中合并 $_GET 和 $_POST ?

    我刚刚在研究 WordPress 源代码 PHP 时看到了这段代码 您可以看到它们将所有 get 和 post 值合并 转换为 1 个请求数组 现在据我所知 通过调用 REQUEST 已经可以使用 GET 和 POSTWITHOUT使用 a
  • 错误:任务“:TMessagesProj:dexDebug”执行失败。进程“命令”jdk1.8.0_66\bin\java.exe”已完成,退出值非零 1

    我已经在 android studio 中导入了 Telegram 项目 在花费 4 小时导入所需的库后 我得到了以下错误 我应该怎么办 错误 任务 TMessagesProj dexDebug 执行失败 com android ide c
  • mocha 和 ts-node 找不到本地 .d.ts 文件

    我有以下项目结构 typetests type test ts myproj d ts tsconfig json 我的 tsconfig json 看起来像这样 compilerOptions module commonjs module
  • Openslide-python 导入错误

    我在运行时收到以下错误import openslide从 python 终端内部 code Traceback most recent call last File code
  • 如何从 python 文件内部导入 Boost.Python

    我正在使用 Boost Python 将解释器嵌入到我的 C 可执行文件中并执行一些预先编写的脚本 我已经让它工作了 这样我就可以调用 python 文件中的函数 但是我想使用的 python 代码导入外部文件 并且这些导入失败 因为 没有
  • scanf()、std::cin 在多线程环境中的行为如何?

    我想用一个例子来说明我的问题 假设有一个数组N N gt gt 1 设置为运行此函数的线程 void Process Some thread safe processing which requires in deterministic c
  • Django - 网络商店模型组织

    我开始在 Django 中创建一个网上商店 它将有不同种类的产品 如衬衫 海报 杯子 贴纸 每种类型的产品都会有不同的领域 例如 衬衫有尺寸和颜色选项 贴纸有尺寸选项 海报和马克杯没有选项 做这个的最好方式是什么 遗产 关系 我仍在学习 D
  • 数据读取器跳过第一个结果

    我有一个相当复杂的 SQL 查询 它根据客户 ID 从数据库中提取不同类型的产品 它提取三种不同类型的产品 通过其唯一标识符编号范围进行标识 即 ID 1000 1999 是一种产品类型 2000 2999 是另一种产品类型 3000 39
  • Angular JS - 如何在 ng-repeat 中添加额外的 DIV

    我有一个数组a 1 2 3 4 5 6 Using ng repeat在这个数组上 我创建了 6 个divs 请参考这个plunker http plnkr co edit fe4nTUFQ9ojEyBsyrOtH p preview 有没
  • SQL 存档脚本

    我正在尝试将数据库中的表中的记录存档到存档数据库中的相同表 我需要能够对日期大于三年前的所有记录进行插入 然后删除这些行 然而 这个表有数百万条实时记录 所以我想在一次大约 100 到 1000 个块的循环中运行它 到目前为止 我的存储过程
  • 双三次插值如何工作?

    在阅读有关该主题的文本后 我发现它考虑了 16 个原始相邻像素 我想知道的是它如何计算新像素的颜色值 如果 16 个像素的颜色值已知 如何计算新像素的值 我认为这已经很好地解释了维基百科 http en wikipedia org wiki
  • 如何在 R 中为新函数绘制 CDF 和 PDF

    如何在 R 中绘制 CDF 和 PDF f lt function x 2 a b x 3 exp b x 2 a 范围从 0 到无穷大 我会使用这样的东西 因为我喜欢ggplot2 a lt 1 b lt 2 f lt function
  • Visual Studio 和 Unity 中使用 MDB 文件进行构建后事件

    我在 Unity 中的 MonoBehaviours 源代码不是 Assets 文件夹内的脚本 而是我作为插件添加的已编译 DLL 我在 Visual Studio 中为我的 C 项目添加了生成后事件 以尝试解决每次更改某些内容时都必须复制
  • Node.js 子进程——spawn 和 fork 之间的区别

    这似乎是一个基本问题 但我找不到任何文档 分叉和生成 Node js 进程有什么区别 我读过分叉是生成的一种特殊情况 但是使用它们每个的不同用例 重复是什么 Spawn 是一个旨在运行系统命令的命令 当您运行spawn时 您向其发送一个系统
  • 如何动态下载字体并将其安装到 iOS 应用程序

    客户希望通过 API 调用下载字体来动态地将字体添加到 iOS 应用程序中 这可能吗 我挖掘出的所有资源都展示了如何手动将 ttf 文件拖到 Xcode 并将其添加到 plist 中 是否可以下载字体并以编程方式在客户端上使用它 Thank