协慌网

登录 贡献 社区

我可以在 iPhone 应用程序中嵌入自定义字体吗?

这个问题涉及 iOS 3.2 之前的版本。从 3.2 开始,使用下面的 samvermette 答案很容易实现这个功能,我已经改变了接受的答案(从命令到 samvermette)以反映这一点。我不能赞同这两个答案(除了 upvotes),但它们都很好。

我想有一个应用程序包括一个自定义字体用于渲染文本,加载它,然后使用它与标准的UIKit元素,如UILabel 。这可能吗?

我在下面找到了链接:

但是这些要求我自己渲染每个字形,这有点太辛苦了,特别是对于多行文本。

我也发现帖子直截了当地表示这是不可能的,但没有理由,所以我正在寻找一个确定的答案。


编辑 - 失败-[UIFont fontWithName:size:]实验

我下载了 Harrowprint.tff(从这里下载)并将其添加到我的 Resources 目录和项目中。然后我尝试了这段代码:

UIFont* font = [UIFont fontWithName:@"Harrowprint" size:20];

导致抛出异常。查看 Finder 中的 TTF 文件,确认字体名称为 Harrowprint。


编辑 - 到目前为止已经有很多回复告诉我阅读关于 X 或 Y 的文档。我已经对所有这些进行了广泛的实验并且无处可去。在一个案例中,X 结果仅与 OS X 相关,而不是在 iPhone 上。因此,我正在为这个问题设置一个赏金,我将奖励给第一个提供答案的人(仅使用文档化的 API),他们会回答足够的信息以便在设备上运行。在模拟器上工作也是一个奖励。


编辑 - 似乎赏金自动奖励得票最多的答案。有趣。实际上没有人提供解决问题的答案 - 涉及编码你自己的UILabel子类的解决方案不支持自动换行,这对我来说是一个必不可少的功能 - 尽管我想我可以扩展它来做到这一点。

答案

iOS 3.2 及更高版本支持此功能。直接来自iPhone OS 3.2 doc 中的新功能

自定义字体支持
想要使用自定义字体的应用程序现在可以在其应用程序包中包含这些字体,并通过在其 Info.plist 文件中包含 UIAppFonts 键来向系统注册这些字体。此键的值是一个字符串数组,用于标识应用程序包中的字体文件。当系统看到密钥时,它会加载指定的字体并使其可供应用程序使用。

Info.plist设置字体后,您可以将自定义字体用作 IB 中的任何其他字体或以编程方式使用。

Apple Developer 论坛上有一个持续的主题:
https://devforums.apple.com/thread/37824 (需要登录)

这是一个非常简单的 3 步教程,介绍如何实现这一目标(删除断开的链接)

  1. 使用 Xcode 作为资源将自定义字体文件添加到项目中
  2. Info.plist文件中添加一个名为UIAppFonts
  3. 将此键设为数组
  4. 对于您拥有的每种字体,请输入字体文件的全名(包括扩展名)作为UIAppFonts数组的项目
  5. 保存Info.plist
  6. 现在在您的应用程序中,您只需调用[UIFont fontWithName:@"CustomFontName" size:12]即可获得与UILabelsUITextViews等一起使用的自定义字体...

另外:确保字体在 Copy Bundle Resources 中。

编辑:从 iOS 3.2 开始,此功能是内置的。如果您需要支持 3.2 之前的版本,您仍然可以使用此解决方案。

我创建了一个扩展UILabel并处理加载. ttf 文件的简单模块。我在 Apache 许可下发布了 opensource 并将它放在 github Here 上。

重要的文件是FontLabel.hFontLabel.m

它使用了Genericrich 的一些代码。

这里浏览来源

要么

  • 将您的字体文件复制到资源中

  • Info.plist文件中添加一个名为 UIAppFonts 的密钥。 (“申请提供的字体)

  • 将此键设为数组

  • 对于您拥有的每种字体,请输入字体文件的全名(包括扩展名)作为 UIAppFonts 数组的项目

  • 保存Info.plist

  • 现在在您的应用程序中,您只需调用[UIFont fontWithName:@"CustomFontName" size:15]即可获得与UILabelsUITextViews等一起使用的自定义字体...

欲获得更多信息

有一种在iOS 4 中使用自定义字体的简单方法。

  1. 将您的字体文件(例如, Chalkduster.ttf )添加到 XCode 中项目的Resources文件夹中。
  2. 打开info.plist并添加一个名为UIAppFonts的新密钥。此键的类型应为数组。
  3. 将自定义字体名称添加到此数组,包括扩展名( Chalkduster.ttf )。
  4. 现在你可以在你的应用程序中使用[UIFont fontWithName:@"Chalkduster" size:16]

不幸的是,IB 不允许使用自定义字体初始化标签。看到这个问题来解决这个问题。我最喜欢的解决方案是使用自定义UILabel子类:

@implementation CustomFontLabel

- (id)initWithCoder:(NSCoder *)decoder
{
    if (self = [super initWithCoder: decoder])
    {
        [self setFont: [UIFont fontWithName: @"Chalkduster" size: self.font.pointSize]];
    }
    return self;
}

@end