SwiftUI 框架中的自定义字体

Luk*_*ker 7 frameworks ios swiftui

我正在为 iOS 应用程序创建一个框架。它将包含一些标签、按钮、列表……全部作为 SwiftUI 视图,但采用特殊设计。在框架中,我添加了一个名为“ContentView”的 SwiftUI 视图,它的目的只是(视觉上)测试画布中的 UI 元素,稍后 ContentView 将被删除。我想为标签设计添加自定义字体,我知道该怎么做:

  1. 将 *.ttf 文件添加到项目中
  2. 调整 info.plist“应用程序提供的字体”
  3. 确保它列在“构建阶段”中(复制捆绑资源)
  4. 与 ".font(.custom("My-Font-Name", size: 34))" 一起使用

但自定义字体(我已经在其他项目(iOS 应用程序)中成功尝试过)未显示在我的 ContentView 中。没有编译错误或任何警告,可以构建框架并且 ContentView 在画布中很好地呈现。只是字体错误。

我尝试重新启动Xcode,删除并添加多次字体,但没有成功。所以这是我的问题:

  1. 是否可以在自定义框架中使用自定义字体?
  2. 由于自定义字体 (*.ttf) 是一种资产,因此是否应将其作为框架的一部分进行不同的对待?
  3. 如果是这样,除了上面提到的步骤 1 到 4 之外,还需要做什么吗?

谢谢你的帮助。

jn_*_*pdx 11

棘手的小问题,但这对我有用:

在自定义框架中,我创建了一个FontLoader类:

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")
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

然后,在我的AppDelegate's中didFinishLaunchingWithOptions,我确保导入框架并加载字体:

import FontTestFramework
//...
FontLoader.loadFont()
Run Code Online (Sandbox Code Playgroud)

后来,在我看来,我成功地使用了该字体:

Text("Test")
  .font(.custom("Opus", size: 30))
Run Code Online (Sandbox Code Playgroud)

我进行了测试,以确保它不仅仅是加载我的 Mac 上安装的版本(因为我使用的是模拟器),而是注释掉FontLoader.loadFont()调用,果然,它默认返回到San Francisco

我用一个otf文件尝试了这一点,但我认为没有任何理由ttf应该表现不同。显然,该otf文件必须是框架目标的一部分。

  • 此代码已过时,请查看此处 /sf/ask/2135553381/ 并搜索另一个 Register 方法( `CTFontManagerRegisterFontsForURL` )。在 GraphicFont 方法文档中找到:“文件支持的字体应使用 CTFontManagerRegisterFontsForURL(_:_:_:) 注册。” (2认同)

Zac*_*son 5

我遇到了与小部件扩展共享字体的类似问题 - 我使用的框架已经使用类似于接受的答案(CTFontManagerRegisterGraphicsFont)的代码构建,并且它在应用程序本身中工作得很好,但是当我尝试使用该框架和我的小部件中的字体,它无法呈现我的任何视图代码。

最终为我解决这个问题的是 @itMaxence 的评论和这个 Apple 线程中建议的更改- 使用CTFontManagerRegisterFontsForURL相反允许它在应用程序和小部件扩展中工作。

只是想强调该评论,以防像我这样的人将来偶然发现该线程。