[英]What's the definition of Font Asset in the Asset Catalog?
从iOS 13开始, CTFontManager
有如下function:
@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
(PostScript 名称是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
}
}
在此之后,打印errors
:
▿ 1 element
- 0 : Error Domain=NSPOSIXErrorDomain Code=22 "Invalid argument" UserInfo={CTFontManagerErrorFontAssetNameKey=(
"Kanit-Regular"
)}
有什么办法让它工作吗?
通过执行以下操作使其工作:
fonts
按需资源标签标记Kanit-Regular
数据资产(标签名称可以是您的偏好名称, fonts
只是示例)。fonts
标签放入Initial Install Tags
Prefetched Resource Tags 部分Signing & Capabilities
中添加Fonts
Capability 并勾选其中的所有框像这样:
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
}
}
}
}
结果
当scope被以.persistent
或.user
的方式传递,以CTFONTMANAGERREGISTER CTFontManagerRegisterFontsWithAssetNames
0140年8月8日。 如果 scope 是.process
或.none
,则返回问题末尾提供的相同errors
output 。
虽然这个 function 不符合我的需要,但我至少验证了它正在工作。 也许有人会发现它很有用。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.