【问题标题】:Custom font in framework for SwiftUISwiftUI 框架中的自定义字体
【发布时间】:2021-02-08 11:12:39
【问题描述】:

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

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

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

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

  1. 是否可以在自定义框架中使用自定义字体?
  2. 由于自定义字体 (*.ttf) 是一种资产,因此作为框架的一部分是否应被区别对待?
  3. 如果是这样,还有什么要做的吗(除了上面提到的第 1 到 4 步)?

感谢您的帮助。

【问题讨论】:

    标签: ios swiftui frameworks


    【解决方案1】:

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

    在自定义框架中,我创建了一个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")
            }
        }
    }
    

    然后,在我的AppDelegatedidFinishLaunchingWithOptions 中,我确保导入我的框架并加载字体:

    import FontTestFramework
    //...
    FontLoader.loadFont()
    

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

    Text("Test")
      .font(.custom("Opus", size: 30))
    

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

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

    【讨论】:

    • 哇,伙计,谢谢你的回答。我想知道您花了多少时间来找出解决方案。我从来没有听说过像“CTFontManagerRegisterGraphicsFont”这样的东西。猜猜,我会在接下来的几天里试试这个。
    • 我最近碰巧遇到了一个场景,我的自定义字体没有被加载到 Catalyst 应用程序中,所以我在想出如何处理这种情况时抢先一步。然后只需将其应用到框架并确保它在那里工作即可。
    • 此代码已过时,请查看此处stackoverflow.com/questions/30507905/… 并搜索另一种注册方法(CTFontManagerRegisterFontsForURL)。在 GraphicFont 方法文档中找到:“文件支持的字体应使用 CTFontManagerRegisterFontsForURL(::_:) 注册。”
    【解决方案2】:

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

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

    只是想突出显示该评论,以防将来像我这样的人偶然发现此线程。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-09-29
      • 2021-09-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-08-11
      • 1970-01-01
      相关资源
      最近更新 更多