当前位置: 首页 > 知识库问答 >
问题:

资产目录中字体资产的定义是什么?

陈刚洁
2023-03-14

从iOS 13开始,CTFontManager具有以下功能:

@discussion Font assets are extracted from the asset catalog and registered. This call must be made after the completion handler of either NSBundleResourceRequest beginAccessingResourcesWithCompletionHandler: or conditionallyBeginAccessingResourcesWithCompletionHandler: is called successfully.
Name the assets using Postscript names for individual faces, or family names for variable/collection fonts. The same names can be used to unregister the fonts with CTFontManagerUnregisterFontDescriptors. In iOS, fonts registered with the persistent scope are not automatically available to other processes. Other process may call CTFontManagerRequestFonts to get access to these fonts.

@param      fontAssetNames
            Array of font name assets in asset catalog.

...

CTFontManagerRegisterFontsWithAssetNames(_ fontAssetNames: CFArray, _ bundle: CFBundle?, _ scope: CTFontManagerScope, _ enabled: Bool, _ registrationHandler: ((CFArray, Bool) -> Bool)?)

然而,资产目录没有任何方式添加“字体资产”。

我试过的:

  • 在此处取字体kanitregular.ttf(后记名称为kanit-regular)。
  • 在资产目录中创建了名为kanit-regular的数据资产。
  • 将字体文件重命名为kanit-regular.ttf并将其放入数据资产。

数据资产的contents.json现在如下所示:

{
   "data" : [
    {
      "filename" : "Kanit-Regular.ttf",
      "idiom": "universal",
      "universal-type-identifier" : "public.truetype-ttf-font"
    }
  ],
  "info" : {
    "author" : "xcode",
    "version" : 1
  }
}
  • 尝试通过CTFontManager
  • 加载此字体

像这样:

func registerFont() {
    var cfBundle: CFBundle?
    if let bundle = Bundle(for: type(of: self)) {
        cfBundle = CFBundleCreate(kCFAllocatorDefault, bundle.bundleURL as CFURL)
    }
    CTFontManagerRegisterFontsWithAssetNames(["Kanit-Regular"] as CFArray, cfBundle, .persistent, true) { (errors, done) -> Bool in
        print(errors)
        return done
    }
}

在此之后,打印错误

▿ 1 element
  - 0 : Error Domain=NSPOSIXErrorDomain Code=22 "Invalid argument" UserInfo={CTFontManagerErrorFontAssetNameKey=(
    "Kanit-Regular"
)}

有什么办法让它起作用吗?

共有1个答案

柳珂
2023-03-14

通过以下操作使其工作:

  • 使用字体按需资源标记来标记KANIT-Regular数据资产(标记名称可以是您首选的名称,字体只是示例)。
  • 字体标记放入初始安装标记预取资源标记部分
  • 签名和功能中添加字体功能,并在其中的所有框中打勾
  • 在注册字体之前实现捆绑资源访问请求

像这样:

func registerFont() {
    var cfBundle: CFBundle?
    var resourceRequest: NSBundleResourceRequest?
    if let bundle = Bundle(for: type(of: self)) {
        resourceRequest = NSBundleResourceRequest(tags: Set(arrayLiteral: "fonts"), bundle: bundle)
        cfBundle = CFBundleCreate(kCFAllocatorDefault, bundle.bundleURL as CFURL)
    }
    resourceRequest?.beginAccessingResources() { error in
        if let error = error {
            print(error)
        } else {
            CTFontManagerRegisterFontsWithAssetNames(["Kanit-Regular"] as CFArray, cfBundle, .persistent, true) { (errors, done) -> Bool in
                print(errors)
                return done
            }
        }
    }
}

结果

当作用域作为.persistent.user传递时,在初始调用CTFontManagerRegisterFontsWithAssetNames函数时,将要求用户将字体安装到系统中,这不是我真正需要的。如果范围是.process.none,则返回与问题末尾提供的相同的errors输出。

虽然这个函数不符合我的需要,但我至少验证了它是工作的。也许有人会觉得有用。

 类似资料:
  • 当我尝试以编程方式将资产中的.ttf文件中的自定义字体设置为android应用中的按钮时,它返回由以下原因引起的错误:java.lang.RuntimeException:font asset找不到Fonts/MenuButton.ttf。Assets文件夹在主目录中,我使用了以下代码:Typeface tpf=Typeface.createFromAsset(this.getAssets(),“

  • loginpage.dart 资产档案包括 错误是 在pubspec中检测到错误。yaml:未找到资产:资产/图像的文件或变体。 失败:构建失败,有一个异常。 > 其中:脚本'C:\Src\flatter\packages\flatter\u tools\gradle\flatter。格雷德尔线:991 错误:任务“:app:compileFlutterBuildDebug”的执行失败。 处理“命

  • 我知道我将文本文件放在了assets\chat1的位置。txt,我的代码也可以与其他txt一起使用,但不知何故,我总是遇到以下错误: 发生异常。 错误(无法加载资产:assets/chat1.txt) 我的代码: pubspec.yaml

  • 我已经在android项目目录的资产文件夹中添加了html和css文件,我想从新的字体支持中加载一种字体,即font/somefont。ttf公司 我尝试过添加不同的方法,但没有一种方法像这里所解释的那样使用Android中WebView的自定义字体 它应该提供apply字体,但我在控制台中遇到此异常 并且没有加载字体。

  • 问题内容: 由于棒棒糖的某种原因,我遇到了这个错误,由于棒棒糖太新了,我无法找到原因,而且我也不知道如何解决。在此先感谢Logcat错误: 编辑:这是引发错误的代码 我的项目文件夹中的资产文件夹中有helvetica.ttf。 编辑:此应用程序在5.0之前的所有设备上均可运行,因此由于某些原因5.0无法识别我的资产文件夹中的文件。 我试图将其屏幕截图发布到我的资产文件夹中,但是我没有足够的声誉来发

  • 问题内容: 我的资产文件夹中有一个文件…我该如何阅读? 现在我正在尝试: 但是它抛出了一个空指针异常… 该文件称为“原始文件”,它位于文件夹资产中 我尝试使用以下方法进行投射: 和 但是都失败了…有什么建议吗? 问题答案: 您可以使用打开输入流。 是该类的一种方法。 还要注意,您不应该重新创建字符缓冲区(,循环的最后一行)。