3 votes

Téléchargez le fichier de police .ttf depuis le web et enregistrez-le sur iPhone

Est-il possible de télécharger un fichier .ttf depuis le Web et de le stocker sur iPhone ? Puis l'utiliser pour les étiquettes et tout le reste ? Parce que mon client souhaite contrôler les polices à partir de la base de données et ne veut pas simplement ajouter les polices au projet xcode tout de suite.

Donc, si à l'avenir il souhaite changer de police, il ajoutera une nouvelle police à la base de données, l'application reconnaîtra la nouvelle police sur le Web (c'est déjà fait avec les images, pas un problème), la téléchargera et l'utilisera comme police.

Merci.

3voto

jaydee3 Points 6967

En fait, il est possible d'ajouter dynamiquement des polices au temps d'exécution iOS de cette manière :

NSData *fontData = /* les données de votre fichier de police */;
CFErrorRef erreur;
CGDataProviderRef fournisseur = CGDataProviderCreateWithCFData((CFDataRef)inData);
CGFontRef police = CGFontCreateWithDataProvider(fournisseur);
if (! CTFontManagerRegisterGraphicsFont(police, &erreur)) {
    CFStringRef descriptionErreur = CFErrorCopyDescription(erreur)
    NSLog(@"Impossible de charger la police : %@", descriptionErreur);
    CFRelease(descriptionErreur);
}
CFRelease(police);
CFRelease(fournisseur);

Source : Cet article de blog de Marco Arment.

2voto

Gyuri T Points 290

Il est possible. J'ai créé un exemple de projet swift sur github. Vous devez simplement ajouter les quelques lignes ci-dessous.

var uiFont : UIFont?
let fontData = data

let dataProvider = CGDataProviderCreateWithCFData(fontData)
let cgFont = CGFontCreateWithDataProvider(dataProvider)

var error: Unmanaged?
if !CTFontManagerRegisterGraphicsFont(cgFont, &error)
{
   print("Erreur de chargement de la police!")
} else {
   let fontName = CGFontCopyPostScriptName(cgFont)
   uiFont = UIFont(name: String(fontName) , size: 30)
}

Lien vers le projet Github

description de l'image ici

1voto

Antonio MG Points 16212

Les polices de caractères doivent être définies dans le plist de votre application, et ce fichier ne peut pas être modifié pendant l'exécution, vous devez donc compiler votre projet avec les polices déjà ajoutées.

Vous devrez trouver un autre moyen de l'implémenter.

0voto

jaydee3 Points 6967

Vous pourriez utiliser FontLabel (https://github.com/vtns/FontLabel)ou quelque chose de similaire pour charger des ttfs à partir du système de fichiers. Je ne pense pas que vous puissiez utiliser des polices téléchargées avec un UILabel. Car vous avez besoin des entrées plist pour chaque police.

0voto

Tim Chen Points 236

Swift 4 solution by extension:

extension UIFont {

    /**
     Une fonction pratique pour créer une police personnalisée avec des données téléchargées.

     - Parameter data: Les données locales du fichier de police.
     - Parameter size: Taille souhaitée de la police personnalisée.

     - Returns: Une police personnalisée à partir des données. `nil` en cas d'échec.

     */
    class func font(withData data: Data, size: CGFloat) -> UIFont? {

        // Convertir les données en NSData pour une conversion pratique.
        let nsData = NSData(data: data)

        // Convertir en CFData et préparer le fournisseur de données.
        guard let cfData = CFDataCreate(kCFAllocatorDefault, nsData.bytes.assumingMemoryBound(to: UInt8.self), nsData.length),
            let dataProvider = CGDataProvider(data: cfData),
            let cgFont = CGFont(dataProvider) else {
            print("Échec de la conversion des données en CGFont.")
            return nil
        }

        // Enregistrer la police et créer UIFont.
        var error: Unmanaged?
        CTFontManagerRegisterGraphicsFont(cgFont, &error)
        if let fontName = cgFont.postScriptName,
            let customFont = UIFont(name: String(fontName), size: size) {
            return customFont
        } else {
            print("Erreur lors du chargement de la police avec l'erreur: \(String(describing: error))")
            return nil
        }

    }
}

Usage:

let customFont = UIFont.font(withData: data, size: 15.0)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X