Afficher une belle NSAttributedString dans un NSRect donné

fouffouf Membre
Bonjour à  tous.

Il se trouve que j'ai eu a dessiner une NSAttributedString dans un NSRect donné de sorte qu'elle ne dépasse pas des limites de ce rectangle. On peut donc utiliser la méthode drawInRect: "classique". Mais quand on fait cela, on prend le risque de voir une mauvaise hyphenation (je crois que c'est comme ca que cela s'appelle). On voudrait donc voir plutot un truc a la mamière du Finder par exemple, qui abrège une partie de la chaine de caractère.

Pour faire cela, il faut utiliser NSParagraphStyle (et sa sous-classe NSMutableParagraphStyle). Voici un exemple qui centre le texte et qui en tronque le milieu si besoin est :

<br />// déclarations<br />NSAttributedString *title;<br />NSDictionary *attributes;<br />NSFont *titleFont;<br />NSMutableParagraphStyle *style; <br /><br />// on crée le style<br />style = [[NSParagraphStyle defaultParagraphStyle] mutableCopy];<br />[style setAlignment:NSCenterTextAlignment]; // texte centré<br />[style setLineBreakMode:NSLineBreakByTruncatingMiddle]; // texte tronqué au milieu<br /><br />//autres attributs et création de la chaine<br />titleFont = [NSFont controlContentFontOfSize:10.0];<br />attributes = [NSDictionary dictionaryWithObjectsAndKeys:[[style copy] autorelease],NSParagraphStyleAttributeName,titleFont,NSFontAttributeName,[NSColor colorWithCalibratedWhite:0.90 alpha:1.0],NSForegroundColorAttributeName,nil]; <br />title = [[NSAttributedString alloc] initWithString:[_element elementName] attributes:attributes];<br /><br />// on dessine dans le rectangle<br />[title drawInRect:drawRect];<br /><br />// ne pas oublier de detruire ce que l&#39;on a créé<br />[title release];<br />[style release];<br />


On passe donc le style de paragraphe en attribut de la chaine créée.

Avis aux écrivains ...

Réponses

  • schlumschlum Membre
    20:37 modifié #2
    Yep, on peut le faire avec une NSCell directement aussi avec "setAttributedStringValue" et "setLineBreakMode".

    Il me semble d'ailleurs que la méthode utilisée par NSCell pour dessiner sa chaà®ne est plus optimisée en interne...
  • fouffouf Membre
    20:37 modifié #3
    Voui mais quand on veux dessiner dans une NSCell (ce que je fait), je crois que ce n'est pas possible de faire ca ... Et puis cette méthode evite aussi d'avoir à  créer un NSCell.
  • schlumschlum Membre
    20:37 modifié #4
    En fait, il y a apparemment encore plus efficace que NSCell : le NSLayoutManager

    http://developer.apple.com/documentation/Cocoa/Conceptual/TextLayout/Tasks/DrawingStrings.html#//apple_ref/doc/uid/20001808-DontLinkElementID_10

    Mais je ne sais pas s'il gère les lineBreaks

    Si tu dessines déjà  dans une NSCell, pourquoi n'utilises-tu pas directement le système de NSCell pour dessiner une NSAttributedString ? À moins que tu ne dessines plusieurs chaà®nes dedans...
  • LeChatNoirLeChatNoir Membre, Modérateur
    20:37 modifié #5
    Hello,
    A noter : le setLineBreakMode n'est valable qu'à  partir de Tiger. Alors que l'autre méthode est ok sous Panther je crois.
    a+
  • fouffouf Membre
    20:37 modifié #6
    Alors, j'avais regardé le layout manager, mais c'est une grosse infrastructure est n'est vraiment utile que lorsque l'on veut afficher des "patés" de texte (genre dans une NSTextView).

    Je pourrais en effet utiliser cette méthode avec les NSCell, mais étant donné que je dessine une image plus un texte plus une autre image avec aussi un highlight particulier, je préférais sous-classer et dessiner moi-même la cellule pour éviter des problèmes  insortables ;)

    [edit le chat va me griller ;)]
    Oui, NSParagraphStyle est disponible sous Panther mais le lineBreakingMode n'est accessible que par Tiger aussi bien par les NSCell que par NSParagraphStyle.
  • LeChatNoirLeChatNoir Membre, Modérateur
    20:37 modifié #7
    Ah ouais exact...
    J'ai un bout de code qui permet d'avoir le même comportement Panther/Tiger...
    Si ça t'intéresse, dis le, je le collerai ce soir dans le post.
  • fouffouf Membre
    20:37 modifié #8
    Ca peut toujours être intéresssant mais comme j'utilise CoreData a fond dans mon appli (et donc comme elle n'est compatible qu'avec Tiger), ce n'est vraiment pas urgent ...
  • schlumschlum Membre
    février 2007 modifié #9
    dans 1172480387:

    Alors, j'avais regardé le layout manager, mais c'est une grosse infrastructure est n'est vraiment utile que lorsque l'on veut afficher des "patés" de texte (genre dans une NSTextView).

    Je pourrais en effet utiliser cette méthode avec les NSCell, mais étant donné que je dessine une image plus un texte plus une autre image avec aussi un highlight particulier, je préférais sous-classer et dessiner moi-même la cellule pour éviter des problèmes  insortables ;)

    [edit le chat va me griller ;)]
    Oui, NSParagraphStyle est disponible sous Panther mais le lineBreakingMode n'est accessible que par Tiger aussi bien par les NSCell que par NSParagraphStyle.


    Okay  ;)
    Après, c'est à  voir si tu fais beaucoup d'affichages de ce genre et si tu veux que ça soit optimisé à  fond (si ça ne lague pas pendant le resize ou autre, y a pas de problème... mais NSString est quand même la pire usine à  gaz pour afficher du texte  :))
Connectez-vous ou Inscrivez-vous pour répondre.