Xcode 8 自定义字体未显示在界面生成器中

Xcode 8 custom font doesn't show up in interface builder

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

  1. 将 .otf 文件复制到项目中。
  2. 确认 .otf 文件已将项目设置为目标。
  3. 在 plist 'Fonts provided by application' 中添加了 .otf 文件。
  4. 在构建阶段中,.otf 文件位于 'Copy Bundle Resources'。
  5. 在我的 Mac.
  6. 上安装字体
  7. 尝试打印所有可用字体,但我看不到自定义字体。

我使用的代码:

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. 但我无法在界面生成器中设置它。有什么想法吗?

截图:

尝试以下步骤:Swift 3.

中测试的代码

第 1 步:将自定义字体添加到项目中(确保添加到目标 勾选)。我正在使用 "PermanentMarker.ttf"、"Pecita.otf" 和 "AROLY.ttf" 字体作为测试字体。

注意:支持字体类型ttfotf(两种字体类型都应该有效)

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

您的 plist 应该如下所示

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

现在,您可以从 viewController 访问自定义字体。我正在通过将 UIlabel 放置到 Storyboard 来测试字体,如下所示。

更新二: Working Solution

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

输出:

更新 1

如果您的自定义字体仍未在 Xcode font list 中列出。请检查与您的问题相关的 link

注意: 不过,您可以通过编程方式将 BebasNeuecustom font 分配给您的标签或按钮等,即使它没有显示在您的 interface Builder。如果您在设置对象字体时遇到问题 programatically.try 下面的方法。

为 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)

输出:

文件夹名称和字体名称之间可能存在差异解决方案是:

  • 打印所有默认字体名称。(没有自定义字体)
  • 向项目添加自定义字体。
  • 打印所有字体名称。

然后比较字体名称。

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)]")
    }
}

这是 old bug 自 Xcode 3.x:

there is a bug/known issue with IB on XCode 3.x with non-standard fonts and Interface Builder. Custom fonts generally need to be set programatically (via [UIFont fontWithName:])

有一些解决方法,例如 thisUser Defined Runtime Attributecategories

当使用相同的字体 (Bebas Neue) 时,我遇到了完全相同的问题:该字体未显示在 Plain 控件的字体列表中。

它适用于 Attributed 控件,如 Joes post 的更新 2 中所述,但您实际上是在更改 attributedText 而不是常规 text ,这可能会导致不良行为。例如,您必须 fiddle 和 NSMutableAttributedString 才能在运行时更改文本或文本颜色。

我对这个问题做了一些调查。我用了 FontLab Studio to modify the font and do some tests. I used Bebas Neue version 1.400 (dated September 15, 2014) from dafont.com.

  • 可能是字体文件被损坏了。 Re-saved 作为 .otf 和 .ttf:没用。
  • 可能字体的元数据已损坏。将所有字形复制到一种新字体并命名为 Bebas Neue:没有用。
  • 我将字体从 Bebas Neue 重命名为 BN:有效! 但为什么呢?
  • 也许您不能在字体名称中使用 "Neue"(因为 Helvetica Neue 是 iOS 系统字体,直到 iOS 8)。将字体重命名为 Test Neue:仍然有效。
  • 也许你不能在字体名称中使用 "Bebas"?将字体重命名为 Bebas:仍然有效。
  • 什么...只是为了确定,我将字体名称改回 Bebas Neue:再次不起作用。
  • 我也试过 BebasNeue:也没用。
  • 然后我把名字改成了 Bebas Neue Whatever: 它有效。

我真的不明白为什么会这样。 Apple 或 Xcode 不希望您在 Interface Builder 中使用 "Bebas Neue" 或 "BebasNeue" 吗? 我安装了正常的 Bebas Neue。也许引用已损坏? 我真的不知道。如果 Bebas Neue 在他们的 Xcode.

中工作,也许使用干净系统的人可以尝试

无论如何,我实现了我的目标:能够将 Bebas Neue(我将最终版本命名为 "Bebas Neue MyAppName")用于 Plain 样式的标签和按钮,因此我可以设计我的应用程序 as-is 并且不必 fiddle 使用属性字符串。

您实际上可以直接进入属性字体,单击自定义字体 window。单击左上角的齿轮,然后单击选项管理字体。 window 应该弹出并在顶部,并且应该有一个加号以允许您添加字体。只需选择您下载的自定义字体,如 xyz.tff,然后应将其添加。

需要注意的重要一点是,ttf 文件应该在 p-list 以及您的项目目录中引用!

我有类似的问题

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

尝试了所有解决方案,但对我没有任何作用。所以这是我的解决方案,再次转到以前的 UILabel (已经有新添加的自定义字体) select->label->select 新添加的字体。检查其他 UI 控件字体。

现在一切正常。

希望这对新开发者有帮助...

现在简单易行- 在 Xcode 10 和 swift 5

中进行了测试

将字体添加到 Xcode

的步骤

Select 您的 UILabel、UITextField 或其他字体部分下的内容,然后按照

步骤 1

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

步骤 2

单击下面标记的添加按钮。

步骤 3

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

将字体添加到项目的步骤

不要忘记使用关键字 Fonts provided by application 向您的 plist 添加描述,并将字体文件放入项目目标设置下的复制包资源中。

是的!就是这样..享受..

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

我不记得我在哪里下载了字体,但是 Bebas Neue 字体 不一致

下载 即应用程序名为 Typelight

打开非常规,但即 粗体 字体 Typelight

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

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

从 Xcode 项目中删除字体文件并重新添加它们可以解决问题(直到下一次)。

就我而言,Interface builder 中缺少一个字体系列,因为该系列中的一种字体未添加到项目中,但在 info.plist 文件中指明。

通常从项目中删除我所有的自定义字体并重新添加它们 - 解决了问题。

TLDR

在 Mac OS 中创建一个新用户帐户,然后在执行我在下面执行的所有步骤之前,看看您是否能够在新帐户中取得成功。事后看来,我可能只需执行第 7 步和第 11 步就可以省去数小时的麻烦。

问题

在不情愿地从 Mojave 升级到 Catalina 以便我可以 运行 最新但不是最好的版本 Xcode (11.5) 之后,我无法再 select 自定义来自界面生成器中 PLAIN 文本控件的字体选择器的字体。

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

失败的步骤

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

  1. 将字体文件重新添加到项目中,希望 Xcode 能够修复 link 到选择器从中加载的字体 table(仍然 不知道为什么选择器中有某些字体以及它在哪里 正在从中获取它们)。
  2. 使用多个终端命令重置 Mac OS 字体缓存,希望选择器从 OS
  3. 中损坏的字体缓存加载列表
  4. 通过在字体簿应用程序中选择 File > Restore Standard Fonts 重置系统字体
  5. 对着电脑尖叫,诅咒 Apple 变成这样
  6. 尝试在 OS 中安装字体以查看是否解决了任何问题,因为我记得几年前我 运行 进入类似的东西时它起作用了。
  7. 在 Internet 上搜索任何线索并尝试几乎所有似乎合理的方法。
  8. 创建了一个 b运行d 新的简单项目...仍然无法select 自定义字体...呃哦

请来大佬们

  1. 诅咒自己没有执行 Catalina 的干净安装,并决定从头开始重新安装 Catalina。
  2. 意识到我在重新安装之前使用 Time Machine 备份我的数据时犯了一个错误,因为它不会让我只带入我的数据文件。迁移助手要求导入库数据(恢复时选项变灰),我不想这样做......再次诅咒苹果和我自己,因为我知道这会咬我......正如我所怀疑的那样配置文件中有垃圾导致了这个(我是对的......见下文)
  3. 试图 select Xcode 中的字体,同时 运行 在迁移助手的导入帐户下...同样的问题...无法 select自定义字体

成功!!!

  1. 创建了一个新用户并在该帐户下创建了一个新的简单项目。答对了!!!我现在可以 select 一个字体了!!!在升级到 Catalina
  2. 期间,我的用户帐户不知何故损坏了