Ausgabe
Hat ab iOS 13 CTFontManager
folgende Funktion:
@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 bietet jedoch keine Möglichkeit, „Font Assets“ hinzuzufügen.
Was ich versucht habe:
- nahm Schriftart
KanitRegular.ttf
(PostScript-Name istKanit-Regular
) hier . - erstelltes Daten-Asset, das
Kanit-Regular
im Asset-Katalog benannt ist. - Schriftartdatei in umbenannt
Kanit-Regular.ttf
und in das Datenobjekt eingefügt.
Die Datenbestände sehen Contents.json
jetzt so aus:
{
"data" : [
{
"filename" : "Kanit-Regular.ttf",
"idiom": "universal",
"universal-type-identifier" : "public.truetype-ttf-font"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}
- Versucht, diese Schriftart über zu laden
CTFontManager
so was:
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
}
}
Danach wird errors
gedruckt:
▿ 1 element
- 0 : Error Domain=NSPOSIXErrorDomain Code=22 "Invalid argument" UserInfo={CTFontManagerErrorFontAssetNameKey=(
"Kanit-Regular"
)}
Gibt es eine Möglichkeit, es zum Laufen zu bringen?
Lösung
Habe es funktioniert, indem ich Folgendes gemacht habe:
- Kennzeichnen Sie das
Kanit-Regular
Datenobjekt mit demfonts
On-Demand-Ressourcen-Tag (der Tag-Name kann der Name Ihrer Wahl sein,fonts
ist nur ein Beispiel). - Fügen Sie das
fonts
Tag inInitial Install Tags
den Abschnitt „Vorab abgerufene Ressourcen-Tags“ ein
- Fügen Sie
Fonts
Fähigkeit hinzuSigning & Capabilities
und aktivieren Sie alle Kästchen darin
- Implementieren Sie die Zugriffsanforderung für Bundle-Ressourcen, bevor Sie Schriftarten registrieren
so was:
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
}
}
}
}
Ergebnis
Wenn der Bereich als .persistent
oder übergeben wird .user
, wird der Benutzer beim ersten Aufruf der CTFontManagerRegisterFontsWithAssetNames
Funktion aufgefordert, Schriftarten im System zu installieren, was ich nicht wirklich brauche. Falls der Geltungsbereich .process
oder ist .none
, wird die gleiche errors
Ausgabe zurückgegeben, die am Ende der Frage bereitgestellt wird.
Obwohl diese Funktion nicht meinen Anforderungen entspricht, habe ich zumindest bestätigt, dass sie funktioniert. Vielleicht findet es jemand nützlich.
Beantwortet von – Eugene Dudnyk
Antwort geprüft von – Gilberto Lyons (FixError Admin)