Afficher une belle NSAttributedString dans un NSRect donné
fouf
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 :
On passe donc le style de paragraphe en attribut de la chaine créée.
Avis aux écrivains ...
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'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 ...
Connectez-vous ou Inscrivez-vous pour répondre.
Réponses
Il me semble d'ailleurs que la méthode utilisée par NSCell pour dessiner sa chaà®ne est plus optimisée en interne...
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...
A noter : le setLineBreakMode n'est valable qu'à partir de Tiger. Alors que l'autre méthode est ok sous Panther je crois.
a+
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.
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.
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 )