3 votes

Télécharger le fichier .ttf du web et le stocker sur l'iPhone

Est-il possible de télécharger un fichier .ttf sur le web et de le stocker sur l'iPhone. Puis l'utiliser pour les étiquettes et toutes les autres choses ? Parce que mon client veut contrôler les polices à partir d'une base de données et ne veut pas simplement déposer les polices dans le projet xcode tout de suite.

Ainsi, à l'avenir, s'il veut 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à le cas avec les images, ce n'est 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 runtime iOS de cette manière :

NSData *fontData = /* your font-file data */;
CFErrorRef error;
CGDataProviderRef provider = CGDataProviderCreateWithCFData((CFDataRef)inData);
CGFontRef font = CGFontCreateWithDataProvider(provider);
if (! CTFontManagerRegisterGraphicsFont(font, &error)) {
    CFStringRef errorDescription = CFErrorCopyDescription(error)
    NSLog(@"Failed to load font: %@", errorDescription);
    CFRelease(errorDescription);
}
CFRelease(font);
CFRelease(provider);

Fuente: Cet article de blog de Marco Arment.

2voto

Gyuri T Points 290

C'est possible. J'ai créé un projet swift d'exemple sur github. Il suffit d'ajouter les quelques lignes ci-dessous.

var uiFont : UIFont?
let fontData = data

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

var error: Unmanaged<CFError>?
if !CTFontManagerRegisterGraphicsFont(cgFont, &error)
{
   print("Error loading Font!")
} else {
   let fontName = CGFontCopyPostScriptName(cgFont)
   uiFont = UIFont(name: String(fontName) , size: 30)
}

Lien vers le projet Github

enter image description here

1voto

Antonio MG Points 16212

Les polices doivent être définies dans la 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 réfléchir à une autre façon de le mettre en œuvre.

0voto

jaydee3 Points 6967

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

0voto

Tim Chen Points 236

Swift 4 par extension :

extension UIFont {

    /**
     A convenient function to create a custom font with downloaded data.

     - Parameter data: The local data from the font file.
     - Parameter size: Desired size of the custom font.

     - Returns: A custom font from the data. `nil` if failure.

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

        // Convert Data to NSData for convenient conversion.
        let nsData = NSData(data: data)

        // Convert to CFData and prepare data provider.
        guard let cfData = CFDataCreate(kCFAllocatorDefault, nsData.bytes.assumingMemoryBound(to: UInt8.self), nsData.length),
            let dataProvider = CGDataProvider(data: cfData),
            let cgFont = CGFont(dataProvider) else {
            print("Failed to convert data to CGFont.")
            return nil
        }

        // Register the font and create UIFont.
        var error: Unmanaged<CFError>?
        CTFontManagerRegisterGraphicsFont(cgFont, &error)
        if let fontName = cgFont.postScriptName,
            let customFont = UIFont(name: String(fontName), size: size) {
            return customFont
        } else {
            print("Error loading Font with error: \(String(describing: error))")
            return nil
        }

    }
}

Utilisation :

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