SwiftUI 框架中的自定义字体
Custom font in framework for SwiftUI
我正在为 iOS 应用创建一个框架。它将包含一些 Label、Button、Lists,... 都是 SwiftUI 视图,但采用特殊设计。在框架中,我添加了一个名为“ContentView”的 SwiftUI 视图,它的目的只是(视觉上)测试 canvas 中的 UI-Elements,稍后 ContentView 将是删除。我想为标签设计添加 自定义字体 ,我知道该怎么做:
- 将 *.ttf 文件添加到项目中
- 调整info.plist“应用程序提供的字体”
- 确定,它列在“构建阶段”(复制包资源)
- 与“.font(.custom("My-Font-Name", size: 34))一起使用”
但是我的 ContentView 中没有显示自定义字体(我已经在其他项目 iOS 应用程序中成功尝试过)。没有编译错误或任何警告,可以构建框架并且在 canvas 中很好地呈现 ContentView。只是字体不对。
我试过重新启动Xcode,删除并添加了几次字体,但没有用。所以这是我的问题:
- 是否可以在自定义 框架 中使用自定义字体?
- 由于自定义字体 (*.ttf) 是一种资产,作为框架的一部分是否需要区别对待?
- 如果是这样,还有什么要做的吗(除了上面提到的步骤 1 到 4)?
感谢您的帮助。
棘手的小问题,但这对我有用:
在自定义框架中,我创建了一个FontLoader
class:
public class FontLoader {
static public func loadFont() {
if let fontUrl = Bundle(for: FontLoader.self).url(forResource: "Opus", withExtension: "otf"),
let dataProvider = CGDataProvider(url: fontUrl as CFURL),
let newFont = CGFont(dataProvider) {
var error: Unmanaged<CFError>?
if !CTFontManagerRegisterGraphicsFont(newFont, &error)
{
print("Error loading Font!")
} else {
print("Loaded font")
}
} else {
assertionFailure("Error loading font")
}
}
}
然后,在我的 AppDelegate
的 didFinishLaunchingWithOptions
中,我确保导入我的框架并加载字体:
import FontTestFramework
//...
FontLoader.loadFont()
后来,在我看来,我成功地使用了字体:
Text("Test")
.font(.custom("Opus", size: 30))
我测试以确保它不只是加载我 Mac 上安装的版本(因为我使用的是模拟器),而是注释掉 FontLoader.loadFont()
调用,果然,它默认回到 San Francisco
我用 otf
文件尝试过,但我认为没有任何理由 ttf
应该表现不同。显然,otf
文件必须是框架目标的一部分。
我在与小部件扩展共享字体时遇到了类似的问题 - 我使用的框架已经使用类似于已接受答案 (CTFontManagerRegisterGraphicsFont
) 的代码构建,并且它在应用程序本身中运行良好,但是当我尝试在我的小部件中使用框架和字体时,它无法呈现我的任何视图代码。
最终为我解决的是@itMaxence 和 this Apple thread 的评论中建议的更改 - 使用 CTFontManagerRegisterFontsForURL
而不是允许它在应用程序和小部件扩展中工作。
只是想突出显示该评论,以防将来像我这样的人无意中看到这个话题。
我正在为 iOS 应用创建一个框架。它将包含一些 Label、Button、Lists,... 都是 SwiftUI 视图,但采用特殊设计。在框架中,我添加了一个名为“ContentView”的 SwiftUI 视图,它的目的只是(视觉上)测试 canvas 中的 UI-Elements,稍后 ContentView 将是删除。我想为标签设计添加 自定义字体 ,我知道该怎么做:
- 将 *.ttf 文件添加到项目中
- 调整info.plist“应用程序提供的字体”
- 确定,它列在“构建阶段”(复制包资源)
- 与“.font(.custom("My-Font-Name", size: 34))一起使用”
但是我的 ContentView 中没有显示自定义字体(我已经在其他项目 iOS 应用程序中成功尝试过)。没有编译错误或任何警告,可以构建框架并且在 canvas 中很好地呈现 ContentView。只是字体不对。
我试过重新启动Xcode,删除并添加了几次字体,但没有用。所以这是我的问题:
- 是否可以在自定义 框架 中使用自定义字体?
- 由于自定义字体 (*.ttf) 是一种资产,作为框架的一部分是否需要区别对待?
- 如果是这样,还有什么要做的吗(除了上面提到的步骤 1 到 4)?
感谢您的帮助。
棘手的小问题,但这对我有用:
在自定义框架中,我创建了一个FontLoader
class:
public class FontLoader {
static public func loadFont() {
if let fontUrl = Bundle(for: FontLoader.self).url(forResource: "Opus", withExtension: "otf"),
let dataProvider = CGDataProvider(url: fontUrl as CFURL),
let newFont = CGFont(dataProvider) {
var error: Unmanaged<CFError>?
if !CTFontManagerRegisterGraphicsFont(newFont, &error)
{
print("Error loading Font!")
} else {
print("Loaded font")
}
} else {
assertionFailure("Error loading font")
}
}
}
然后,在我的 AppDelegate
的 didFinishLaunchingWithOptions
中,我确保导入我的框架并加载字体:
import FontTestFramework
//...
FontLoader.loadFont()
后来,在我看来,我成功地使用了字体:
Text("Test")
.font(.custom("Opus", size: 30))
我测试以确保它不只是加载我 Mac 上安装的版本(因为我使用的是模拟器),而是注释掉 FontLoader.loadFont()
调用,果然,它默认回到 San Francisco
我用 otf
文件尝试过,但我认为没有任何理由 ttf
应该表现不同。显然,otf
文件必须是框架目标的一部分。
我在与小部件扩展共享字体时遇到了类似的问题 - 我使用的框架已经使用类似于已接受答案 (CTFontManagerRegisterGraphicsFont
) 的代码构建,并且它在应用程序本身中运行良好,但是当我尝试在我的小部件中使用框架和字体时,它无法呈现我的任何视图代码。
最终为我解决的是@itMaxence 和 this Apple thread 的评论中建议的更改 - 使用 CTFontManagerRegisterFontsForURL
而不是允许它在应用程序和小部件扩展中工作。
只是想突出显示该评论,以防将来像我这样的人无意中看到这个话题。