在iOS上,我能访问系统提供的字体的TTF文件吗?

11

我正在尝试使用FTGLES在iOS上的OpenGL-ES中动态显示任意字体的文本(参见我的SO问题这里)。该库似乎需要直接访问TTF文件才能使用字体。使用纯净的方法,是否可以通过路径直接访问iOS上的系统字体文件?我已经阅读了官方文档但没有找到相关信息。

如果不能,有人知道在提交应用程序之前将系统字体复制到应用程序中是否被Apple批准?


除了官方API之外,访问应用程序沙盒之外的任何内容都是被拒绝的理由。因此,无论是否实际可能,我建议不要这样做。 - Jakob Borg
是的,我正在寻找范围内的东西。我编辑了帖子以使其更清晰。 - Clay Bridges
3个回答

12

我的解决方案受到了skia的启发。

虽然不能直接访问系统内置字体文件,但我们仍有一种间接的方式:

使用您想要的字体名称创建一个CGFont,通过简单调用CGFontCopyTableTags()和CGFontCopyTableForTag()即可访问此CGFont的所有SFNT表格内容。

可以使用这些表格构建ttf/otf字体数据,将新创建的字体保存到磁盘中,稍后可以在FTGL ES中使用它。


3
这段话的含义是:这个东西我没有用所有内置字体进行全面测试,但在我的所有情况下都能很好地工作。 - EXphinx
你的代码即使经过这么多年,仍然在 macOS 和 iOS 上运行得非常出色。对于其他人,可以使用 CFStringCreateWithCString 函数和 字体名称 来创建内存中的字体,然后使用 CGFontCreateWithFontName 函数来创建字体。 - electromaggot

8
不,你无法访问iOS设备上安装的系统TTF文件。因此,您需要嵌入您想要使用的字体。
免责声明:我不是律师,使用苹果提供的系统字体在iOS应用程序中的可接受性是关于解释软件许可证的法律问题,因此您可能需要寻求专业建议。
您希望在应用程序中嵌入苹果提供的字体。 “嵌入”的定义有点模糊,因此将字体添加到iOS应用程序中可能符合版权持有人对“嵌入”的定义,也可能不符合。有些字体公司将“嵌入”定义为仅查看包含字体的预定内容;其他人则意味着在该字体中查看和编辑内容。在运行应用程序期间更改的内容显示在这两种情况之间。
根据Mac OS X Lion 10.7.2 ELUA:
F.字体。除非本许可证的条款和条件规定,否则您可以使用Apple软件中包含的字体来显示和打印内容;但是,如果所涉及的字体附带的嵌入限制允许,则只能在内容中嵌入字体。这些嵌入限制可以在Font Book / Preview / Show Font Info面板中找到。
如果在iOS应用程序中使用字体确实是“嵌入”,则您只需在Font Book中检查要使用的特定字体即可。
在这种情况下,我会找到一个字体或一组字体,其中我已获得明确许可以包含在iOS应用程序中。我将从各种字体公司开始寻找明确允许此类使用的许可计划。这可能会变得昂贵,因此另一种方法是寻找具有允许此类使用的许可证的开源字体。或者,对于非常有限的字符集(例如仅数字),我甚至会考虑绘制自己的字体。

感谢您的好回答。不过很遗憾...我想沙盒技术带来的安全保障要比让应用程序无限制地访问系统资源所带来的好处更重要,这样可以防止您的应用程序变得几个K或MB更大。 - jheriko

0

不行。您的应用程序无法访问应用程序沙盒之外的文件。除非它被越狱了;)。但是您确实可以捆绑字体文件。现在,我看不出为什么苹果会拒绝您的应用程序,因为它正在使用设备上已经可用的文件,并且您只是将本地文件包含在其中。在版权方面,苹果已经获得了使用它在其设备上的许可,因此您的包含应该没有问题。

我说“应该”是因为我没有需要这种功能,也没有通过自己的提交进行测试,但基于我过去看到的法律直觉和字体版权问题,我认为这不会成为问题。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接