[英]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.