自定义字体仅在 Interface Builder 中设置时可用

Posted

技术标签:

【中文标题】自定义字体仅在 Interface Builder 中设置时可用【英文标题】:Custom Fonts only available when set in Interface Builder 【发布时间】:2015-07-15 23:34:44 【问题描述】:

我在我的项目中添加了自定义字体。 它包含在目标中,并添加到 plist 中。 当我尝试以编程方式使用它时它不起作用,并且当我打印出可用字体列表时它不会显示。 但是,它确实显示为 Interface Builder 中的一个选项,如果我在 IB 中将标签的文本设置为该字体,它会正常工作并在我打印出可用字体列表时显示。 这是 XCode 6.4 和 ios 8.0

当它通过 IB 工作时,它会以如下字体名称打印出来: 特别精英 SpecialElite-Regular

我以编程方式调用字体,例如: [UIFont fontWithName:@"SpecialElite-Regular" size:fontSize];

使用内置字体执行此操作没有问题。

【问题讨论】:

[UIFont fontWithName:@"SpecialElite-Regular" size:fontSize]; 好的,很好。但结果是nil 是的。字体为零 所以它没有以该名称加载。 但是当我从 IB 执行此操作时,它会以该名称加载,因为当我打印出所有可用字体时它会显示出来 但是您没有正确加载它。我坚持! 【参考方案1】:

当我尝试以编程方式使用它时它不起作用,并且当我打印出可用字体列表时它也不显示

这证明您实际上没有将它正确地包含在目标和Info.plist中。

似乎在 IB 中工作的原因是该字体也存在于 您的计算机上。但事实上,如果你在你的设备上运行这个应用程序,你会发现即使在 IB 中设置字体也不起作用。

您的字体是 Special Elite。如您所见,我在正在运行的应用程序中可以看到它:

这是我使用的代码:

    let lab = UILabel()
    lab.text = "This is a test"
    lab.font = UIFont(name:"SpecialElite-Regular", size:18)
    lab.sizeToFit()
    lab.frame.origin = CGPointMake(100,100)
    self.view.addSubview(lab)

所以你看,它可以在代码中引用这个字体——如果它被正确加载。您显然没有正确加载它。它不在您的 app bundle 中,或者不在复制构建阶段,或者在您的 Info.plist 中没有正确列出。

(当然,您调用[UIFont fontWithName:size:] 时的名称或大小总是有错误的值。)

【讨论】:

这很有趣,但是当我在设备上运行它时它确实有效 那么你在代码中引用它的方式一定有问题。您可能使用了错误的名称 - 学习正确的名称并不容易!显示引用它的代码,以及可用字体的日志记录。 编辑您的问题 - 您不能在评论中显示此类内容。 :)【参考方案2】:

好的,话题很老了,但我想在这里投入两分钱。

首先,阅读这篇文章http://codewithchris.com/common-mistakes-with-adding-custom-fonts-to-your-ios-app/

简而言之:

    记得在项目中包含你的字体 字体设置目标 检查您的字体是否作为资源包含在捆绑包中 将自定义字体添加到 plist 文件中 在代码中检查字体的真实名称

当我按照本文所述进行所有操作时,我的字体只能在界面生成器中使用。第 5 步也有问题 - 我的字体没有显示在控制台输出中。

好的,现在是我给点建议的时候了:

提示 #1

使用 otf 字体格式,如果你有不同,转换它(或询问你的设计师;)) 你可以使用这个网站:https://onlinefontconverter.com/

提示 #2

在上面的文章中你可以找到:

打开它并添加一个名为“应用程序提供的字体”的新行 将是一个数组,您需要添加字体的所有文件名 你想用。

输入“UIAppFonts”而不是“应用程序提供的字体” 请记住,如果您有多个 plist 文件,请为所有文件设置此项。

【讨论】:

【参考方案3】:

正如其他人所提到的,以下文章对于诊断问题非常有用。 http://codewithchris.com/common-mistakes-with-adding-custom-fonts-to-your-ios-app/

另外,在向 Xcode 项目添加自定义字体时,添加单个字体而不是存储所有字体的目录。如果添加该目录,字体将在 Interface Builder 中可见,但在正在运行的应用程序中不可见。

【讨论】:

【参考方案4】:

Matt 很好地隔离了问题...我没有正确加载字体。

就我而言,问题出在 Info.plist 中。

我在 Info.plist 中使用字体名称列出字体。这是不正确的。您应该使用 文件名在 Info.plist 中列出字体。

【讨论】:

感谢您的反馈! 我不小心遗漏了该文件名中的扩展名“.ttf”...【参考方案5】:

我知道这很旧,但我遇到了同样的问题。仅当我在界面生成器中选择该字体时,该字体才会显示。结果当我搜索UIAppFonts 时,由于某种原因它没有列出主要的Info.plist(我们已经在使用自定义字体)。因此,我最终将字体添加到导致此问题的本地化 (?) plist 文件中。我必须做的是转到 Project Settings > Target > Info 选项卡并在那里添加字体文件名。

【讨论】:

【参考方案6】:

问题是您没有在代码中提供正确的字体名称,要获取字体名称,请运行此代码。

 for family: String in UIFont.familyNames
    
        print("\(family)")
        for names: String in UIFont.fontNames(forFamilyName: family)
        
            print("== \(names)")
        
    

它将打印所有字体,搜索您的字体并给出正确的名称。

 let attributedText = NSMutableAttributedString(string: "We 
 Apologize! \n This feature is only available for \n Go 4.0 
 Subscriptions", attributes: [NSAttributedStringKey.font : 
 UIFont(name: "SpecialElite-Regular", size: 22)!])

【讨论】:

以上是关于自定义字体仅在 Interface Builder 中设置时可用的主要内容,如果未能解决你的问题,请参考以下文章

自定义 UILabel 视图未在 Interface Builder 中更新其框架

如果我为标签字体使用外观代理,我无法通过 Interface Builder 设置字体大小

使用 Interface Builder 构建的自定义 UIView 可通过 Interface Builder 访问/定位

Interface Builder - 自定义类未显示

在 Interface Builder 中自定义 UITableViewCell

来自 Interface Builder 的自定义 UIView