[Résolu] Modification de la couleur d'une fonte définie

berfisberfis Membre
novembre 2013 modifié dans API AppKit #1

Bonjour,


 


Un point de détail, qui me fait errer dans la doc depuis quelques heures. J'aimerais passer en rouge (à  l'affichage uniquement) une fonte déjà  définie par l'utilisateur, en gardant les attributs définis par lui, y compris la couleur.


 


Texte quelconque --> Texte quelconque


Texte quelconque --> Texte quelconque


Texte quelconque --> Texte quelconque


 


Le texte est dans une NSString (donc les attributs de texte s'appliquent à  l'ensemble de la chaà®ne). Je peux sans problème accéder à  la NSFont choisie, mais comment "rajouter" l'attribut "fontColor = red"?


 


Merci.


 

Mots clés:

Réponses

  • AliGatorAliGator Membre, Modérateur
    Une NSFont définit un ensemble de glyphes (comment les caractères sont dessines, leur forme si tu veux). La couleur c'est un attribut de dessin. Tu utiliseras la même police de caractères pour écrire ton texte en rouge ou en vert.


    Sur iOS textColor est une propriété de UILabel. Sur OSX j'ai pas révisé mais ça doit être le même principe, une propriété de NSLabel ou je ne sais quoi dans ce goût la.
  • Bonjour AliGator,


     


    Je dessine directement ma propriété NSString, je n'ai pas de NSLabel:



    NSDictionary *textAttributes = @{NSFontAttributeName:(NSFont*) [[_desks.classroom selection]valueForKey:@deskFont], NSParagraphStyleAttributeName: style, NSForegroundColorAttributeName:textColor};
    [theName drawInRect:nameRect withAttributes:textAttributes];

    La couleur est stockée via la clé NSForegroundColorAttributeName du NSDictionary des attributs de la NSString. Maintenant, j'aimerais récupérer les attributs définis par l'utilisateur pour les stocker dans [NSColor textColor]. Actuellement, je les "écrase" en définissant NSColor *textColor = [NSColor blackColor] et en priant pour que l'utilisateur en reste au noir, mais bien sûr il va s'en trouver un (ou une) pour vouloir du mauve et s'étonner que ça ne marche pas... 


  • mpergandmpergand Membre
    novembre 2013 modifié #4

    Il faut utiliser NSAttributedString


     


     


    NSAttributedString Application Kit Additions Reference

     

    Drawing the String

     


     


    Ca marche aussi avec NSString, il faut juste que tu conserves le dico des attributs pour pouvoir le modifier et l'utiliser à  chaque drawInRect




  • Ca marche aussi avec NSString, il faut juste que tu conserves le dico des attributs pour pouvoir le modifier et l'utiliser à  chaque drawInRect




    Comment conserver le dictionnaire d'une NSString? Mon idée était:


    1. Récupérer le dictionnaire de la fonte définie par l'utilsateur


    2. Modifier la clé NSForegroundColorAttributeName


    3. drawInRect

  • LarmeLarme Membre
    novembre 2013 modifié #6

    Un NSString n'a pas d'attribut/dico normalement...

    Uniquement les NSAttributedString...


    Donc à  moins de faire une classe spéciale avec un String et un Dico, ça risque d'être plus dur...


     


    Sur un NSAttributedString, tu peux aisément récupérer les Attributs, y'a pleins de trucs sur le net pour faire ça, entre les enumerateAttributed:InRange:XxX ou attributesAtIndex:XxX, etc.




  • Un NSString n'a pas d'attribut/dico normalement...




    https://developer.apple.com/library/mac/documentation/Cocoa/Reference/ApplicationKit/Classes/NSString_AppKitAdditions/Reference/Reference.html


    Normalement non, mais Appkit a ajouté quelques routines bienvenues.


    PS: Ma NSString est un attribut Core Data, je ne peux pas en faire une NSAttributedString à  la légère.


     


    Maintenant, s'il faut 15 lignes de code pour changer la couleur d'une string, je la laisse en noir...



  • https://developer.apple.com/library/mac/documentation/Cocoa/Reference/ApplicationKit/Classes/NSString_AppKitAdditions/Reference/Reference.html


    Normalement non, mais Appkit a ajouté quelques routines bienvenues.


    PS: Ma NSString est un attribut Core Data, je ne peux pas en faire une NSAttributedString à  la légère.


     


    Maintenant, s'il faut 15 lignes de code pour changer la couleur d'une string, je la laisse en noir...




    Intéressant.


    Mais je pense que ces attributs ne sont que pour faire un simili NSAttributedString avec un NSString pour du draw... Du coup, pas réellement d'attributs en soit lié au NSString...


    J'ai pas regardé en profondeur, mais je me demande si ce n'est pas pour faire :


    [monAttrbutedString string] drawblabla withAttributes:[monAttributedString attributed] (écrit en pseudo code).

  • AliGatorAliGator Membre, Modérateur

    Je dessine directement ma propriété NSString, je n'ai pas de NSLabel:

    C'est vrai que normalement, ce code devrait marcher :
    NSColor *color = [NSColor greenColor];
    NSDictionary *attributes = [NSDictionary dictionaryWithObject:color forKey:NSForegroundColorAttributeName];
    [text drawAtPoint:point withAttributes:attributes];
    Mais sinon, tu peux aussi changer la couleur de ton pinceau avant de dessiner. De mémoire, un truc dans le style :
    CGContextSetFillColorWithColor(UIGraphicsGetCurrentContext(), color.CGColor);
  • Finalement, j'ai défini la couleur "de base" dans un nouvel attribut. ça m'a forcé à  me mettre au Core Data Model Versioning et à  la migration des données.


     


    Avant que je m'y mette ça avait l'air compliqué, et une fois réalisé j'en viens à  me demander ce qui m'a retenu si longtemps...


     


    Reste un truc: j'aimerais pouvoir transformer le message orienté-programmeur:


     


    La migration du magasin persistant a échoué car le modèle d'objet géré source est absent.


     


    par quelque chose de plus orienté-utilisateur, comme:


     


    Ce document a été créé avec une version plus récente de "MonApp" et ne peut être ouvert.


     


    Mais c'est un autre sujet.


    En tous les cas, merci de votre aide et de vos propositions concrètes!


  • AliGatorAliGator Membre, Modérateur
    Heu c'est quoi le rapport avec CoreData ?

    (t'en a jamais fait mention dans ton post avant le dernier...)
  • berfisberfis Membre
    novembre 2013 modifié #12

    "une fonte déjà  définie par l'utilisateur, en gardant les attributs définis par lui, y compris la couleur." (#1)


    "PS: Ma NSString est un attribut Core Data, je ne peux pas en faire une NSAttributedString à  la légère." (#7)


     

    Maintenant, le modèle qu'il y a derrière, who cares...  ^_^


  • AliGatorAliGator Membre, Modérateur
    Je vois pas trop le rapport entre ta citation #1 et CireData mais bon oui j'avais loupé ton PS de #7.


    Par contre j'ai tjs du mal à  comprendre les formulation que tu as utilisées #1 étant donné que la couleur n'est ni une propriété de NSString ni de NSFont ;)
  • berfisberfis Membre
    novembre 2013 modifié #14
    Justement mon problème venait de là : je pensais qu'elle était stockée dans l'une ou l'autre. Mais ensuite j'ai compris qu'elle devait se trouver ailleurs, et j'ai donc dû rajouter un attribut à  une entité.


    Ce qui m'a induit en erreur, en fait, c'est qu'il existe une option "couleur" sur le panel du NSFontManager. Et cette clé dans le dictionnaire de NSString drawAtPoint. Mais ça roule, maintenant!
  • AliGatorAliGator Membre, Modérateur

    Et cette clé dans le dictionnaire de NSString drawAtPoint. Mais ça roule, maintenant!

    Bah oui justement, qui montre que cette couleur est un paramètre à  passer au moment de dessiner, car elle n'est pas un attribut inhérent à  la NSString elle-même ;)
  • ... La doc, c'est toi  -_-


Connectez-vous ou Inscrivez-vous pour répondre.