Ajuster la hauteur d'un NSTextField en fonction du nombre de lignes
Mala
Membre, Modérateur
Tout est dans le titre. :P
Je cherche à calculer la hauteur (La largeur est fixe) à donner à un NSTextField en fonction du texte que j'y mets afin que tout le texte soit lisible.
Si quelqu'un a une piste, je suis preneur.
Je cherche à calculer la hauteur (La largeur est fixe) à donner à un NSTextField en fonction du texte que j'y mets afin que tout le texte soit lisible.
Si quelqu'un a une piste, je suis preneur.
Connectez-vous ou Inscrivez-vous pour répondre.
Réponses
La méthode size de NSAttributedString ne convient pas pour ce problème ?
+
Chacha
Je vais regarder de plus près la doc sur boundingRectWithSize que propose Eddy. Je ne connaissais pas cette méthode.
Dans IB le token est un delegate de l'object qui controlle le nib.
En fouillant dans cette direction, j'ai constaté que ça n'avait pas l'air de fonctionner d'après les retours sur les listes d'Apple. Du coup je suis tombé sur un bout de code partant d'une NSTextView. Une fois adapté voici ce que cela donne:
Ca marche au poil même pour mes NSTextField. Cela me semble la solution la plus simple et directement intégrable à une catégorie en attendant mieux.
[tt]-(float)heightWithFont:(NSFont*)font width:(float)width {
NSTextContainer *textContainer = [[NSTextContainer alloc] initWithContainerSize:NSMakeSize(width,MAXFLOAT)];
[textContainer setLineFragmentPadding:0.0];
NSLayoutManager *layoutManager = [NSLayoutManager new];
[layoutManager addTextContainer:textContainer];
[textContainer release];
NSDictionary *attrs = NSDictionary alloc] initWithObjectsAndKeys:<br /> font ?: [NSFont systemFontOfSize:[NSFont systemFontSize, NSFontAttributeName,
nil];
NSTextStorage *textStorage = [[[NSTextStorage alloc] initWithString:self attributes:attrs] autorelease];
[textStorage addLayoutManager:layoutManager];
[attrs release];
[layoutManager release];
(void) [layoutManager glyphRangeForTextContainer:textContainer];
//if not called, usedRectForTextContainer: will return .0
return [layoutManager usedRectForTextContainer:textContainer].size.height;
}[/tt]
ça parait plus complexe, mais en fait c'est ce que fait la textview.