Xcode 8自定义字体无法在界面构建器中显示

55

我正在尝试在我的iOS应用程序中使用自定义字体(Bebas Neue)。我采取的步骤如下:

  1. 将.otf文件复制到项目中。
  2. 确认.otf文件已将项目设置为目标。
  3. 在plist中添加“应用程序提供的字体”中的.otf文件。
  4. 在构建阶段,.otf文件位于“复制包资源”中。
  5. 在我的Mac上安装字体。
  6. 尝试打印出所有可用的字体,但我找不到我的自定义字体。

我使用的代码:

for name in UIFont.familyNames() {
  println(name)
  if let nameString = name as? String
  {
    println(UIFont.fontNamesForFamilyName(nameString))
  }
}
  1. 我尝试在代码中设置字体,结果成功了。

我使用的代码:

textLabel?.font = UIFont(name: "BebasNeueRegular", size: 14)
  1. 但我无法在界面构建器中设置它。有什么建议吗?

截图:

字体 字体列表


有一种简单的方法可以检查您的自定义字体是否可用于您的项目。只需将UILabel放置到您的mainStroryBoard中。选择标签并转到字体管理器,选择自定义并检查您的自定义字体是否列在字体列表中。如果您的自定义字体列在列表中,则该字体可用于您的项目。如果没有,则说明您的字体导入存在问题。我建议您将更多字体(otf和ttf)导入到您的项目中,并查看它们是否起作用... - Joe
我知道你的问题了,你是在导入后更改了字体名称。你能否使用当前的字体名称更新这一行代码 textLabel?.font = UIFont(name: "FontName", size: 14)? - Joe
textLabel?.font = UIFont(name: "BebasNeue", size: 14)。尝试一下,它应该可以工作,你的plist字体名称应该像这样BebasNeue.otf。 - Joe
@Joe,我已经更新了我的代码。正如我所提到的,我可以通过编程方式设置字体,但我也想在界面构建器中设置字体。 - chengsam
@chengsam,你解决问题了吗?我也遇到了完全相同的字体问题,不知道如何修复,已经尝试了我能想到的所有方法... - Pierre Mardon
显示剩余12条评论
11个回答

65

尝试以下步骤: 代码在Swift 3中测试。

步骤1:将自定义字体添加到项目中(确保选择了添加到目标)。 我使用“PermanentMarker.ttf”,“Pecita.otf”和“AROLY.ttf”字体作为测试字体。

注意:支持的字体类型为ttfotf(这两种字体类型都应该可以工作)

步骤2:修改application-info.plist文件。在新行中添加键“Fonts provided by application”,并将“PermanentMarker.ttf”作为数组“Fonts provided by application”中的新项目添加。

您的plist应如下所示

enter image description here

现在这个字体将在Interface Builder中可用。 要在代码中使用自定义字体,我们需要按名称引用它,但是名称通常与字体的文件名不同。

现在,您可以从viewController访问自定义字体。 我通过像下面这样在Storyboard中放置一个UIlabel来测试字体。

更新2:工作解决方案

在导入您的自定义字体并更新您的plist之后。 从storyBoard中选择label,转到Attributes Inspector,在Label下选择Text type>更改为Attributed,然后从列表中选择您的custom font

enter image description here

enter image description here

enter image description here

输出:

enter image description here

更新1

如果您的自定义字体仍未在Xcode字体列表中列出。 请查看与您问题相关的链接

注意:即使您的interface Builder中未显示,仍然可以将BebasNeuecustom font按程序指定分配给您的标签或按钮等。 如果设置对象字体时遇到问题,请尝试以下方法。

将字体分配给UILabel:

    label?.font = UIFont(name: "BebasNeue", size: 35) // Set to any size

给UIButton分配字体:

    button.titleLabel?.font = UIFont(name: "BebasNeue", size: 35)

给 UITextField 分配字体:

    textField.font = UIFont(name: "BebasNeue", size: 25) 

为UINavigationBar分配字体:

    navigationController?.navigationBar.titleTextAttributes = [NSFontAttributeName: UIFont(name: "BebasNeue", size: 25)!, NSForegroundColorAttributeName: UIColor.red]

为UIToolBar分配字体:

    UIBarButtonItem.appearance().setTitleTextAttributes([NSFontAttributeName: UIFont(name: "BebasNeue", size: 25.0)!], for: UIControlState.normal)

输出:

在这里输入图片描述


谢谢您的回答,您能否使用BebasNeue进行测试?因为我可以在界面构建器中使用其他字体使其正常工作,但不能使用此字体。 - chengsam
最终更新2的解决方案对我起作用了!谢谢Joe!! - chengsam
1
我有同样的问题。BebasNeue字体仅支持属性文本显示。 - tbago

20

现在,添加字体到Xcode已经变得简单易行-已在Xcode 10和Swift 5中进行了测试

将字体添加到您的Xcode的步骤:

选择您的UILabel、UITextField或其他组件,然后在字体选项下按照以下步骤操作:

步骤1:

从字体选择屏幕的左上角选择设置菜单。选择字体管理器选项。

输入图像描述

步骤2:

点击如下所示的添加按钮。

输入图像描述

步骤3:

选择包含您的字体的文件夹。它将被加载到XCode的字体列表中。

将字体添加到您的项目的步骤

别忘了在plist中使用键Fonts provided by application添加描述,并将字体文件放置在项目目标设置下的复制捆绑资源中。

是的!就这样,享受吧!


1
是的,这就是方法。我成功地将字体包含并用于项目中,但字体在界面构建器上并没有出现。原来Xcode从系统中读取字体列表,这确实有道理。注意:对于任何遇到此问题的人,请记得正确地将字体包含到您的项目中,否则它将无法在未安装该字体的计算机上工作。 - yeyo
我通过打开Font Book应用程序解决了这个问题,然后从“用户”部分中删除字体,最后将字体文件拖到“计算机”部分(这需要重新启动Xcode)。 - Lluis Gerard
1
当项目安装在另一个未安装这些自定义字体的人的 Mac 上时会发生什么? - Starwave

16

使用相同字体(Bebas Neue)时,我遇到了完全相同的问题:在普通控件的字体列表中找不到该字体。

富文本控件中,如Joe文章中的更新2所述,它是存在的,但这实际上是在改变attributedText而不是常规的text,可能会导致意外行为。例如,您将必须在运行时使用NSMutableAttributedString来更改文本或文本颜色。

我对此问题进行了一些调查。我使用FontLab Studio修改字体并进行了一些测试。我使用了dafont.com上的Bebas Neue版本1.400(日期为2014年9月15日)

  • 可能字体文件某种方式已损坏。重新保存为.otf和.ttf:无效。
  • 可能字体元数据已损坏。将所有字形复制到新字体中,并将其命名为Bebas Neue:无效。
  • 我将字体从Bebas Neue重命名为BN:有效!但为什么呢?
  • 可能不能在字体名称中使用“Neue”(因为Helvetica Neue是iOS 8之前的iOS系统字体)。将字体重命名为Test Neue:仍然有效。
  • 那么,不能在字体名称中使用“Bebas”吗?将字体重命名为Bebas:仍然有效。
  • 什么……为了确保,我将字体名称更改回Bebas Neue:又失效了。
  • 我还尝试了BebasNeue:也无效。
  • 然后我将名称更改为Bebas Neue Whatever:有效。

    Bebas Neue Whatever

我真的不理解这为什么会发生。 Apple或Xcode难道不想让你在Interface Builder中使用“Bebas Neue”或“BebasNeue”吗? 我安装了普通的Bebas Neue,也许引用文件被损坏了? 我真的说不清楚。也许干净的系统上的某些人可以尝试一下Bebas Neue是否适用于他们的Xcode。

无论如何,我达到了我的目标:能够在Plain样式标签和按钮中使用Bebas Neue(我将最终版本命名为“Bebas Neue MyAppName”),这样我就可以按原样设计我的应用程序,而不必费心去调整属性字符串。


2
对我来说是相同的解决方案。看起来Xcode不喜欢字体名称,直到我更改它的FullName元数据。 - Nick Jones
3
你是如何更改名称的?我遇到了与这个特定字体相同的问题。 - Buyin Brian
5
由于Bebas Neue字体的授权许可是SIL开放字体许可证,允许免费再分配,所以我上传了一个已经预先重命名的版本,您可以在此处下载:http://ge.tt/14SV3fj2。祝好运! - Flitskikker
感谢 @Flitskikker 太棒了!!!你提供的字体对我有用。你能否为BebasNeue-Bold,BebasNeue-Thin和BebasNeue-Light提供重命名的字体? - Sandip Patel - SM
在我的情况下,我只是删除了空格,现在它可以工作了。只有一个字体出现了一些奇怪的问题。 - Hrabovskyi Oleksandr
显示剩余2条评论

9

最终,我找到了Bebas Neue字体问题的根本原因

我不记得在哪里下载过这些字体,但是Bebas Neue字体不一致性

下载i.e.名为Typelight的应用程序

使用Typelight打开非常规,例如粗体字体。

enter image description here

您需要纠正大部分Bebas Neue字体。


浪费了很多时间,谢谢你的发布 :) 我没想到字体本身会成为一个问题。 - Makalele
2
谢谢,这很有帮助!事实上,我注意到在姓氏中有“Neue”这个词会导致问题,所以只需将姓氏改名为“Bebas”就足够了。 - staticVoidMan
我可以确认将字体重命名为Bebas就足够了。 - Skoua

4
也许文件夹名称和字体名称有所不同,解决方法如下:
  • 打印所有默认字体名称。(不包括自定义字体)
  • 将自定义字体添加到项目中。
  • 打印所有字体名称。
之后比较字体名称。
func printFontsNames() {
    let fontFamilyNames = UIFont.familyNames
    for familyName in fontFamilyNames {
        print("------------------------------")
        print("Font Family Name = [\(familyName)]")
        let names = UIFont.fontNames(forFamilyName: familyName )
        print("Font Names = [\(names)]")
    }
}

2

您可以直接进入属性字体中,点击自定义字体窗口。然后点击左上角的齿轮,并选择“管理字体”选项。一个窗口会弹出,在顶部应该有一个加号来允许您添加字体。只需选择您下载的自定义字体(如xyz.tff),然后它就会被添加。

需要注意的是,ttf文件不仅应在p列表中引用,还应在您的项目目录中引用!


其实,不算太远。字体可以在应用程序内安装,但不能安装到您的系统中。对我来说,将字体安装到苹果的字体册中解决了这个问题。 - user1162328

1

简述

在进行以下步骤之前,请在Mac OS中创建一个新用户账户并查看是否能够成功。事后想想,我可能只需要执行第7步和第11步就可以省下几个小时的麻烦。

问题

由于我不情愿地从Mojave升级到Catalina,以便运行最新版本但不是最好的Xcode(11.5),我无法为界面生成器中的普通文本控件选择自定义字体。

正如其他人提到的那样,属性文本可以正常工作,因为它使用系统字体选择器而不是使用普通文本时出现的“黑盒子/这些字体来自哪里?”选择器。

失败的步骤

我尝试了以下步骤,但都没有成功:

  1. 重新添加字体文件到项目中,希望Xcode会修复选择器加载字体表的链接(仍然不知道为什么选择器中有某些字体以及它们从哪里获取)。
  2. 使用几个终端命令重置Mac OS字体缓存,希望选择器从操作系统中损坏的字体缓存列表加载。
  3. 通过在Font Book应用程序中选择文件>恢复标准字体来重置系统字体。
  4. 对着电脑大喊并诅咒苹果公司变得如此糟糕。
  5. 尝试在操作系统中安装字体,以查看是否解决了任何问题,因为我记得几年前遇到类似问题时这种方法有效。
  6. 在互联网上搜索任何线索,并尝试几乎所有看起来合理的方法。
  7. 创建一个全新的简单项目......仍然无法选择自定义字体......出现问题了。

请出大杀器

8. 因为没有进行干净的Catalina安装而自责,决定从头开始重新安装Catalina。 9. 意识到在重新安装之前使用Time Machine备份数据是错误的,因为它不允许我仅导入我的数据文件。迁移助手需要导入库数据(还原时选项灰色),而我不想这样做……又因为我知道这会让我很痛苦,所以我再次责怪苹果和自己,因为我知道这会影响我(我是对的……请参见下文)。 10. 尝试在使用迁移助手导入的帐户下在Xcode中选择字体……同样的问题……无法选择自定义字体。 11. 成功了!!!创建了一个新用户并在该帐户下创建了一个新的简单项目。BINGO!!!现在我可以选择字体了!!!不知何故,在升级到Catalina期间,我的用户帐户已经损坏了。

0

对我来说,这仍然是Swift 4.2的一个经常出现的问题,即使没有进行任何可能导致它的更改。

从Xcode项目中删除字体文件,然后再次添加它们可以解决问题(直到下一次出现为止)。


0

这是一个自 Xcode 3.x 以来的旧问题

XCode 3.x 中 IB 存在一个与非标准字体和 Interface Builder 相关的已知问题/bug。通常需要通过编程方式(通过 [UIFont fontWithName:])设置自定义字体。

有一些解决方法,例如使用 thisUser Defined Runtime Attribute 以及 categories


0

我曾经遇到过类似的问题。

我添加了自定义字体,并将其分配给UILabel,一切都正常工作,但几次之后它就不能按预期工作了。

尝试了所有解决方案,但对我来说都没有用。所以这是我的解决方案,再次进入以前的UILabel(已经添加了新的自定义字体),选择->标签->选择新添加的字体。检查其他UI控件的字体。

现在它可以正常工作了。

希望这能帮助新开发者......


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