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

如何解决资产目录中字体资产的定义是什么?

从 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)?)

但是,Asset Catalog 没有任何方法可以添加“字体资产”。

我尝试过的:

  • 采用字体 KanitRegular.ttf(PostScript 名称Kanit-Regularhere
  • 在资产目录中创建了名为 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
    }
}

此后,打印 errors

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

有什么办法让它工作吗?

解决方法

通过执行以下操作使其正常工作:

  • 使用 Kanit-Regular 按需资源标签标记 fonts 数据资产(标签名称可以是您的偏好名称,fonts 只是示例)。
  • fonts 标签放入 Initial Install Tags 预取资源标签部分

Initial Install Tags Resource Tags section

  • Fonts 中添加 Signing & Capabilities 功能并勾选其中的所有框

enter image description here

  • 在注册字体前实现捆绑资源访问请求

像这样:

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 输出。

虽然这个功能不符合我的需求,但我至少验证了它是有效的。也许有人会觉得它很有用。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?