Swift NSAttributedString自定义字体

10

我已经阅读了不同的解决方案,但似乎没有什么能够解决这个问题。该代码产生了一个nil异常:

[NSFontAttributeName: UIFont(name: "Raleway-SemiBold", size: 16)!]

我已经正确安装字体并在应用程序中正常显示 (目标已设置)。
我尝试在plist中添加提供的应用程序字体,但没有任何反应。 我无法编辑数组中的项目:(它们是item0:string:Raleway-SemiBold.tff)

基本上我被卡住了... 有时候Swift和Apple环境对于程序员来说很好,但大多数时间它们都存在许多故障,并且需要很多变通方法才能达到预期的结果。

非常感谢您提前的任何帮助。


2
你是否验证过 UIFont(name: "Raleway-SemiBold", size: 16) 不是 nil?- 不是冒犯,但我怀疑苹果或 Swift 是罪魁祸首 :) - Martin R
不要误会,我并不怪苹果或Swift,这个项目需要我做很多变通,而这只是我必须发泄的时刻 :)。嗯,我猜它们是nil,因为编译器说在解包时意外地发现了nil。但字体已经包含在应用程序中,并且在界面等方面都可以正常工作。 - Razvan Soneriu
一个常见的陷阱是在 UIFont(name: ...) 中指定错误的字体名称,它并不是文件名。但一定有数十个问答提供了确切的指令... - Martin R
我刚刚遍历了字体名称,但我的字体没有列在那里...编辑:实际上只有9个中的4个被列出来了。 - Razvan Soneriu
“我尝试在plist中添加应用提供的字体”和“我无法为数组中的项目命名”是什么意思? - Martin R
我尝试添加应用程序键中提供的建议字体到plist中,阅读时发现它应该是一个字体名称数组。"The I can't name" 是一个笔误,我将会纠正它。 - Razvan Soneriu
3个回答

19

你遇到了一个异常,因为 UIFont(name: "Raleway-SemiBold", size: 16) 返回了 nil,而你使用了强制解包符号 ! 进行解包。

相反,可以使用条件解包:

if let font = UIFont(name: "Raleway-SemiBold", size: 16) {
    let attributes = [NSFontAttributeName: font]
    // do something with attributes
} else {
    // The font "Raleway-SemiBold" is not found
}

您可以使用UIFont的方法familyNames()fontNamesForFamilyName(_:)获取所需的确切字符串。

Swift 4

if let font = UIFont(name: "Raleway-SemiBold", size: 16) {
    let attributes = [NSAttributedStringKey.font: font]
    // do something with attributes
} else {
    // The font "Raleway-SemiBold" is not found
}

那我应该循环遍历字体并查看名称吗?这些字体已安装并在应用程序的其他部分工作。 - Razvan Soneriu
当然!如果您在那里没有看到您期望的字体名称,请参考此答案中的故障排除步骤。 - Aaron Brager

2

对于Swift 3,以下是经过测试可行的更新:

首先,您需要设置字体,然后使用 NSFontAttributeName 创建一个 textAttribute

let font = UIFont(name: "Raleway-SemiBold", size: 16)
textAttribute = [NSFontAttributeName: font as Any, NSForegroundColorAttributeName: UIColor.black]

你可以将textAttribute应用于标签、文本字段等。

2
你只需要写出正确的字体名称即可。
  1. 不要写字体文件名(比如bodoni-mt-bold.ttf,它是我从某个网站下载的文件名)。
  2. 要查找确切的字体名称,请参考下面的图片。
  3. 进入标签选择并转到自定义字体,然后在其系列中查看您自定义字体的名称。如果您的自定义字体名称存在,则将其复制并粘贴为字符串在您想使用它的位置。(注意,您无法复制字体名称文本,您必须在其他地方编写然后再粘贴)

enter image description here


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