我正在尝试在 macOS WidgetKit 扩展中显示自定义(但已内置于操作系统中)字体。它们是
American Typewriter
和 Avenir
。
尽管它在基本应用程序中工作得很好,但我发现它不可能在小部件中工作。我已经使用了无数种类似
Font.custom("Avenir", size: 25).bold(),
的变体,但它就是行不通。
它在 WidgetKit 模拟器中完美显示,但在存档应用程序并将其放入我的应用程序文件夹后运行时,它不会。当它使用的 UserDefaults 设置在启动时设置为这些字体之一时,小部件将打开,但它将采用某种 Arial 占位符字体。
如果我在小部件处于活动状态时将 UserDefaults 键更改为这些字体之一并重新加载它,它将完全崩溃。
显示系统字体或在系统默认字体和系统衬线之间更改时不会发生这种情况。
这是我用来获取字体的代码示例(这些 UserDefaults 值已被确认正确同步):
static let getSmallFont: Font = {
switch UserDefaults(suiteName: "com.timekeeper")?.string(forKey: "font") {
case "modern": return Font.custom("Avenir", size: 25).bold()
case "fancy": return .system(size: 25, weight: .bold, design: .serif)
case "old": return Font.custom("American Typewriter", size: 25).bold()
case nil: return .system(size: 25, weight: .bold, design: .default)
default: return .system(size: 25, weight: .bold, design: .default)
}
}()
以及我用来将具有该字体的文本添加到我的视图中的简单代码:
Text(entry.date, style: .time)
.font(WidgetEntryView.getSmallFont)
不完全是你的问题,但对于自定义字体,我意识到我需要将字体文件嵌入到小部件中才能工作,否则屏幕根本不会显示内容。
然后我嵌入字体文件并在 Info.plist 中声明它们。它不能以编程方式工作。
现在不知道其他系统字体了