ios - écriture - telecharger police iphone sur android




Puis-je intégrer une police personnalisée dans une application iPhone? (20)

Swift, code way: (works also with swift 2.0)

Add the required fonts to your project (just like adding images, just drag to Xcode), make sure that they are targeted to your project
add this method and load custom fonts (recommended in appDelegate didFinishLaunchingWithOptions )

func loadFont(filePath: String) {

    let fontData = NSData(contentsOfFile: filePath)!

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

    var error: Unmanaged<CFError>?
    if !CTFontManagerRegisterGraphicsFont(cgFont, &error) {
        let errorDescription: CFStringRef = CFErrorCopyDescription(error!.takeUnretainedValue())
        print("Unable to load font: %@", errorDescription, terminator: "")
    }

}

Use example:

if let fontPath = NSBundle.mainBundle().pathForResource("My-Font", ofType: "ttf"){
      loadFont(fontPath)
}

Use the font:

UIFont(name: "My-Font", size: 16.5)

Cette question concerne iOS pré-3.2. À partir de la version 3.2, cette fonctionnalité est facilement réalisable en utilisant la réponse de samvermette ci-dessous, et j'ai changé la réponse acceptée (de commande en samvermette) pour refléter cela. Je ne peux pas donner de crédit aux deux réponses (en dehors des upvotes), mais ils sont tous les deux bons.

Je voudrais avoir une application inclure une police personnalisée pour le rendu du texte, le charger, et ensuite l'utiliser avec des éléments UIKit standard comme UILabel . Est-ce possible?

J'ai trouvé ci-dessous des liens:

mais cela exigerait que je rende moi-même chaque glyphe, ce qui est un peu trop dur, spécialement pour le texte multi-lignes.

J'ai aussi trouvé des articles qui disent carrément que ce n'est pas possible, mais sans justification, alors je cherche une réponse définitive.

EDIT - failed -[UIFont fontWithName:size:] expérience

J'ai téléchargé Harrowprint.tff (téléchargé à partir d' here ) et l'ai ajouté à mon répertoire Ressources et au projet. J'ai ensuite essayé ce code:

UIFont* font = [UIFont fontWithName:@"Harrowprint" size:20];

ce qui a entraîné une exception étant levée. Regarder le fichier TTF dans le Finder a confirmé que le nom de la police était Harrowprint.

EDIT - il y a eu un certain nombre de réponses à ce jour qui me disent de lire la documentation sur X ou Y. J'ai beaucoup expérimenté avec tout cela et je n'ai obtenu nulle part. Dans un cas, X s'est avéré pertinent uniquement sur OS X, pas sur iPhone. Par conséquent, je mets une prime pour cette question, et je vais attribuer la prime à la première personne qui fournit une réponse (en utilisant seulement des API documentées) qui répond avec suffisamment d'informations pour que cela fonctionne sur l'appareil. Travailler sur le simulateur serait aussi un bonus.

EDIT - Il semble que la prime automatique attribue la réponse avec le plus grand nombre de votes. Intéressant. Personne n'a vraiment fourni une réponse qui a résolu la question comme demandé - la solution qui implique le codage de votre propre sous-classe UILabel ne supporte pas le mot-wrap, qui est une caractéristique essentielle pour moi - mais je suppose que je pourrais l'étendre.


Ajoutez d'abord la police au format .odt à vos ressources, dans ce cas nous utiliserons DINEngschriftStd.otf, puis utilisez ce code pour affecter la police à l'étiquette

[theUILabel setFont:[UIFont fontWithName:@"DINEngschriftStd" size:21]];

Pour vous assurer que votre police est chargée sur le projet, appelez simplement

NSLog(@"Available Font Families: %@", [UIFont familyNames]);

Sur le .plist vous devez déclarer la police. Ajoutez simplement un enregistrement 'Polices fournies par l'application' et ajoutez une chaîne de l'élément 0 avec le nom de la police (DINEngschriftStd.otf)


Dans Info.plist, ajoutez l'entrée "Polices fournies par l'application" et incluez les noms de police en tant que chaînes:

Fonts provided by application
           Item 0        myfontname.ttf
           Item 1        myfontname-bold.ttf
           ...

Ensuite, vérifiez que votre police est incluse en exécutant:

for (NSString *familyName in [UIFont familyNames]) {
    for (NSString *fontName in [UIFont fontNamesForFamilyName:familyName]) {
         NSLog(@"%@", fontName);
    }
}

Notez que votre nom de fichier ttf n'est peut-être pas le même que celui que vous utilisez lorsque vous définissez la police de votre étiquette (vous pouvez utiliser le code ci-dessus pour obtenir le paramètre "fontWithName"):

[label setFont:[UIFont fontWithName:@"MyFontName-Regular" size:18]];

Il est très facile d'ajouter une nouvelle police sur votre application iOS existante.

Vous avez juste besoin d'ajouter la police par exemple font.ttf dans votre dossier de ressources.

Ouvrez votre application info.plist . Ajoutez une nouvelle ligne en tant que "Polices fournies par l'application" et tapez le nom de la police en tant que police.ttf.

Et lors de la définition de la police faire comme setFont:"corresponding Font Name"

Vous pouvez vérifier si votre police est ajoutée ou non par NSArray *check = [UIFont familyNames]; .

Il renvoie toutes les polices que votre application prend en charge.


Il existe une nouvelle façon d'utiliser des polices personnalisées, en commençant par iOS 4.1. Il vous permet de charger les polices dynamiquement, que ce soit à partir de fichiers inclus avec l'application, les données téléchargées, ou ce que vous avez. Il vous permet également de charger les polices au fur et à mesure que vous en avez besoin, tandis que l'ancienne méthode les charge toutes au démarrage de l'application, ce qui peut prendre trop de temps si vous avez beaucoup de polices.

La nouvelle méthode est décrite sur ios-dynamic-font-loading

Vous utilisez la fonction CTFontManagerRegisterGraphicsFont , en lui donnant un tampon avec vos données de police. Il est alors disponible pour UIFont et les vues Web, tout comme avec l'ancienne méthode. Voici l'exemple de code de ce lien:

NSData *inData = /* 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);

Il n'est pas encore sorti, mais la prochaine version de cocos2d (framework de jeu 2d) prendra en charge les polices bitmap de longueur variable en tant que cartes de caractères.

http://code.google.com/p/cocos2d-iphone/issues/detail?id=317

L'auteur n'a pas de date de sortie clouée pour cette version, mais j'ai vu un message indiquant que ce serait dans le mois ou les deux mois à venir.


J'ai essayé les différentes suggestions sur cette page sur iOS 3.1.2 et voici mes conclusions:

Il ne suffit pas d'utiliser [UIFont fontWithName:size:] avec les polices du répertoire Resources, même si le nom FOND est défini à l'aide de FontForge.

[UIFont fontWithName:size:] fonctionnera si les polices sont chargées en premier avec GSFontAddFromFile. Mais GSFontAddFromFile ne fait pas partie d'iOS 3.1.2, il doit donc être chargé dynamiquement comme décrit par @rpetrich.


Je l'ai fait comme ceci:

Chargez la police:

- (void)loadFont{
  // Get the path to our custom font and create a data provider.
  NSString *fontPath = [[NSBundle mainBundle] pathForResource:@"mycustomfont" ofType:@"ttf"]; 
  CGDataProviderRef fontDataProvider = CGDataProviderCreateWithFilename([fontPath UTF8String]);

  // Create the font with the data provider, then release the data provider.
  customFont = CGFontCreateWithDataProvider(fontDataProvider);
  CGDataProviderRelease(fontDataProvider); 
}

Maintenant, dans votre drawRect: faites quelque chose comme ceci:

-(void)drawRect:(CGRect)rect{
    [super drawRect:rect];
    // Get the context.
    CGContextRef context = UIGraphicsGetCurrentContext();
    CGContextClearRect(context, rect);
    // Set the customFont to be the font used to draw.
    CGContextSetFont(context, customFont);

    // Set how the context draws the font, what color, how big.
    CGContextSetTextDrawingMode(context, kCGTextFillStroke);
    CGContextSetFillColorWithColor(context, self.fontColor.CGColor);
    UIColor * strokeColor = [UIColor blackColor];
    CGContextSetStrokeColorWithColor(context, strokeColor.CGColor);
    CGContextSetFontSize(context, 48.0f);

    // Create an array of Glyph's the size of text that will be drawn.
    CGGlyph textToPrint[[self.theText length]];

    // Loop through the entire length of the text.
    for (int i = 0; i < [self.theText length]; ++i) {
        // Store each letter in a Glyph and subtract the MagicNumber to get appropriate value.
        textToPrint[i] = [[self.theText uppercaseString] characterAtIndex:i] + 3 - 32;
    }
    CGAffineTransform textTransform = CGAffineTransformMake(1.0, 0.0, 0.0, -1.0, 0.0, 0.0);
    CGContextSetTextMatrix(context, textTransform);
    CGContextShowGlyphsAtPoint(context, 20, 50, textToPrint, [self.theText length]);
}

Fondamentalement, vous devez faire un peu de force brute en boucle à travers le texte et farzing environ avec le nombre magique pour trouver votre décalage (ici, voyez-moi en utilisant 29) dans la police, mais cela fonctionne.

En outre, vous devez vous assurer que la police est légalement intégrable. La plupart ne le sont pas et il y a des avocats qui se spécialisent dans ce genre de choses, alors soyez prévenus.


Oui, vous pouvez inclure des polices personnalisées. Reportez-vous à la documentation sur UIFont, plus précisément, la fontWithName:size:

1) Assurez-vous d'inclure la police dans votre dossier de ressources.

2) Le "nom" de la police n'est pas nécessairement le nom du fichier.

3) Assurez-vous que vous avez le droit légal d'utiliser cette police. En l'incluant dans votre application, vous la distribuez également et vous devez avoir le droit de le faire.


Peut-être que l'auteur a oublié de donner à la police un nom Mac FOND ?

  1. Ouvrez la police dans FontForge puis allez dans Element> Font Info
  2. Il existe une option "Mac" dans laquelle vous pouvez définir le nom du FOND.
  3. Sous Fichier> Exporter la police, vous pouvez créer un nouveau ttf

Vous pouvez également essayer l'option "Apple" dans la boîte de dialogue d'exportation.

DISCLAIMER : Je ne suis pas un développeur IPhone!


Rechercher ATSApplicationFontsPath

Une entrée simple qui vous permet d'inclure le (s) fichier (s) de police dans le dossier de ressources de votre application et qui "fonctionnent" dans votre application.


Si vous utilisez xcode 4.3 , vous devez ajouter la font à la Build Phase sous Copy Bundle Resources , selon https://.com/users/1292829/arne dans le thread, Custom Fonts Xcode 4.3 . Cela a fonctionné pour moi, voici les étapes que j'ai prises pour les polices personnalisées pour travailler dans mon application:

  1. Ajoutez la police à votre projet. J'ai glissé et déposé les fichiers OTF (ou TTF ) dans un nouveau groupe que j'ai créé et j'ai accepté le choix de xcode de copying the files over to the project folder .
  2. Créez le tableau UIAppFonts avec vos polices répertoriées en tant qu'éléments dans le tableau. Juste les names , pas l'extension (par exemple " GothamBold ", " GothamBold-Italic ").
  3. Cliquez sur le project name du project name en haut du Project Navigator sur le côté gauche de l'écran.
  4. Cliquez sur l'onglet Build Phases qui apparaît dans la zone principale de xcode.
  5. Développez la section " Copy Bundle Resources " et cliquez sur "+" pour ajouter la police.
  6. Sélectionnez le fichier de police à partir du navigateur de fichiers qui s'ouvre lorsque vous cliquez sur le "+" .
  7. Faites ceci pour chaque police que vous devez add to the project .

Un avis important: Vous devez utiliser le "nom PostScript" associé à la police, pas son nom complet ou son nom de famille. Ce nom peut souvent être différent du nom normal de la police.


Une meilleure solution consiste à ajouter une nouvelle propriété " Fonts provided by application " à votre fichier info.plist .

Ensuite, vous pouvez utiliser votre police personnalisée comme UIFont normal.


iOS 3.2 et ultérieur supportent ceci. Tout droit sorti du document Quoi de neuf dans iPhone OS 3.2 :

Support de polices personnalisé
Les applications qui souhaitent utiliser des polices personnalisées peuvent maintenant inclure ces polices dans leur groupe d'applications et enregistrer ces polices avec le système en incluant la clé UIAppFonts dans leur fichier Info.plist. La valeur de cette clé est un tableau de chaînes identifiant les fichiers de polices dans l'ensemble de l'application. Lorsque le système voit la clé, il charge les polices spécifiées et les met à la disposition de l'application.

Une fois les polices définies dans Info.plist , vous pouvez utiliser vos polices personnalisées comme toute autre police dans IB ou par programmation.

Il y a un fil conducteur sur les Forums des développeurs Apple:
https://devforums.apple.com/thread/37824 (connexion requise)

Et voici un excellent et simple tutoriel en 3 étapes sur la façon d'y parvenir (lien brisé enlevé)

  1. Ajoutez vos fichiers de police personnalisés dans votre projet en utilisant Xcode comme ressource
  2. Ajoutez une clé à votre fichier UIAppFonts appelé UIAppFonts .
  3. Faire de cette clé un tableau
  4. Pour chaque police que vous avez, entrez le nom complet de votre fichier de police (y compris l'extension) en tant qu'éléments dans le tableau UIAppFonts
  5. Enregistrer Info.plist
  6. Maintenant, dans votre application, vous pouvez simplement appeler [UIFont fontWithName:@"CustomFontName" size:12] pour obtenir la police personnalisée à utiliser avec vos UILabels et UITextViews , etc ...

Aussi: Assurez-vous que les polices sont dans vos ressources Bundle de copie.


suivez cette étape

1) Copiez votre police dans votre projet

2) ouvrez votre fichier .plist en mode code source ... (Note- Ne pas ouvrir info.plist )

3) Avant cela - Faites un clic droit sur votre police et ouvrez-le dans fontforge ou un éditeur similaire et install le dans votre système, il devrait être install

4) Tapez ceci

 <key>UIAppFonts</key>
<array>
    <string>MyriadPro.otf</string>
</array>

5) Tapez ce code dans votre class .m

 [lblPoints setFont:[UIFont fontWithName:@"Myriad Pro" size:15.0]];

Ici, les lblPoints seront modifiés à partir de votre UILabel

Terminé!! Si votre police ne fonctionne toujours pas, vérifiez d'abord la compatibilité de vos polices


edit: Cette réponse est supprimée à partir de iOS3.2; utiliser UIAppFonts

La seule façon dont j'ai réussi à charger des UIFont personnalisés est via le framework privé GraphicsServices.

Ce qui suit chargera toutes les polices .ttf dans le paquet principal de l'application:

BOOL GSFontAddFromFile(const char * path);
NSUInteger loadFonts()
{
    NSUInteger newFontCount = 0;
    for (NSString *fontFile in [[NSBundle mainBundle] pathsForResourcesOfType:@"ttf" inDirectory:nil])
        newFontCount += GSFontAddFromFile([fontFile UTF8String]);
    return newFontCount;
}

Une fois les polices chargées, elles peuvent être utilisées comme les polices fournies par Apple:

NSLog(@"Available Font Families: %@", [UIFont familyNames]);
[label setFont:[UIFont fontWithName:@"Consolas" size:20.0f]];

GraphicsServices peut même être chargé au moment de l'exécution au cas où l'API disparaîtrait à l'avenir:

#import <dlfcn.h>
NSUInteger loadFonts()
{
    NSUInteger newFontCount = 0;
    NSBundle *frameworkBundle = [NSBundle bundleWithIdentifier:@"com.apple.GraphicsServices"];
    const char *frameworkPath = [[frameworkBundle executablePath] UTF8String];
    if (frameworkPath) {
        void *graphicsServices = dlopen(frameworkPath, RTLD_NOLOAD | RTLD_LAZY);
        if (graphicsServices) {
            BOOL (*GSFontAddFromFile)(const char *) = dlsym(graphicsServices, "GSFontAddFromFile");
            if (GSFontAddFromFile)
                for (NSString *fontFile in [[NSBundle mainBundle] pathsForResourcesOfType:@"ttf" inDirectory:nil])
                    newFontCount += GSFontAddFromFile([fontFile UTF8String]);
        }
    }
    return newFontCount;
}

Although some of the answers above are correct, I have written a detailed visual tutorial for people still having problems with fonts.

The solutions above which tell you to add the font to the plist and use

[self.labelOutlet setFont:[UIFont fontWithName:@"Sathu" size:10]];

are the correct ones. Please do now use any other hackish way. If you are still facing problems with finding font names and adding them, here is the tutorial -

Using custom fonts in ios application


One-liner for Swift 3+ for printing out all font names:

UIFont.familyNames.forEach { print(UIFont.fontNames(forFamilyName: $0)) }

You can add the required "FONT" files within the resources folder. Then go to the Project Info.plist file and use the KEY "Fonts provided by the application" and value as "FONT NAME".

Then you can call the method [UIFont fontwithName:@"FONT NAME" size:12];







fonts