自定义字体仅在 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 访问/定位