Largeur de lettre

fouffouf Membre
15:12 modifié dans API AppKit #1
Bonjour à  tous.
L'ai besoin de calculé la place que prend une chaine de caractère que je vais afficher à  l'écran. J'utilise donc NSAttributedString et sa méthode size pour faire cela, ca marche très bien. Mais c'est lent. En effet,, il faut à  chaque fois que je crée une NSAttributedString temporaire à  chaque fois que la méthode est appelé ce qui est fait très souvent. Etant donné que le taille et la police de mes lettres n'étant pas cahngeanble, je pense donc utilisé la méthode length de NSString pour récupérer la longueur de la chaine et ensuite la multiplié par la taille moyenne (ou maximale) des caractères. Je continuerai toujours à  utiliser NSAttributedString pour le dessin, mais ca sera deja ca de fait ;)

Merci d'avance à  tous :fouf):

Réponses

  • Eddy58Eddy58 Membre
    15:12 modifié #2
    Puisque ta fonte ne change pas et que sa taille est constante, tu peux établir une table des valeurs précalculées des largeurs de chaque caractère de cette fonte. :)
    Tu crées tout d'abord un petit projet qui se charge de construire ta table. Cette table pourrait se présenter sous forme d'un dictionary, composé de clés ayant pour noms les caractères (a,b,c,d,etc...) et de valeur stockées dans des NSNumber de types float pour les largeurs associées à  chaque caractère. Quand le dictionary est prêt, tu l'enregistres dans un fichier sous forme xml, puis tu peux ensuite l'inclure dans le bundle de ton projet.
    Après tu n'as plus qu'à  calculer la largeur de ta chaà®ne selon les valeurs de ta table.
    [tt]
    NSDictionary *tableDictionary=...; // Initialisation de la table selon tes soins
    NSString *maString=@CalculLargeurChaine; // Chaine dont on veux la largeur
    int nbCharString=[maString length]; // Nbres de caractères dans la chaine
    float largeurChaine=0;                  // Largeur de la chaine
    for (i=0;i<nbCharString;i++)
    {
        // On retrouve la valeur associée au caractère en cours et on l'ajoute au total
        largeurChaine=largeurChaine+tableDictionary valueForKey:[maString substringWithRange:NSMakeRange(i,1) floatValue];
    }
    [/tt]
    Bien sûr ensuite il faut comparer par rapport à  la méthode classique si tu gagnes vraiment du temps, et déterminer si c'est vraiment valable.
  • fouffouf Membre
    15:12 modifié #3
    Merci beaucoup Eddy. C'est une manière très élégante de faire cela, mais j'ai réussi à  faire marcher mon truc avec des constantes. C'est plus rapide pour ce que je veux faire et comme je n'ai pas besoin d'une grande précision, c'est pas trop grave. Voila donc mon code :

    <br />_nameSize = NSMakeSize([_name length]*11,12);<br />
    


    Merci encore ;)
  • Eddy58Eddy58 Membre
    15:12 modifié #4
    Oui c'est un peu plus simple ainsi. :P ;)
Connectez-vous ou Inscrivez-vous pour répondre.