[FIXED] Was ist die Definition von Font Asset im Asset-Katalog?

Ausgabe

Hat ab iOS 13 CTFontManagerfolgende 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 ist Kanit-Regular) hier .
  • erstelltes Daten-Asset, das Kanit-Regularim Asset-Katalog benannt ist.
  • Schriftartdatei in umbenannt Kanit-Regular.ttfund in das Datenobjekt eingefügt.

Die Datenbestände sehen Contents.jsonjetzt 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 ladenCTFontManager

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 errorsgedruckt:

▿ 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-RegularDatenobjekt mit dem fontsOn-Demand-Ressourcen-Tag (der Tag-Name kann der Name Ihrer Wahl sein, fontsist nur ein Beispiel).
  • Fügen Sie das fontsTag in Initial Install Tagsden Abschnitt „Vorab abgerufene Ressourcen-Tags“ ein

Erstinstallations-Tags Abschnitt Ressourcen-Tags

  • Fügen Sie FontsFähigkeit hinzu Signing & Capabilitiesund aktivieren Sie alle Kästchen darin

Geben Sie hier die Bildbeschreibung ein

  • 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 .persistentoder übergeben wird .user, wird der Benutzer beim ersten Aufruf der CTFontManagerRegisterFontsWithAssetNamesFunktion aufgefordert, Schriftarten im System zu installieren, was ich nicht wirklich brauche. Falls der Geltungsbereich .processoder ist .none, wird die gleiche errorsAusgabe 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)

0 Shares:
Leave a Reply

Your email address will not be published. Required fields are marked *

You May Also Like