Ajuster la hauteur d'un NSTextField en fonction du nombre de lignes

MalaMala Membre, Modérateur
23:52 modifié dans API AppKit #1
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.  :o

Réponses

  • ChachaChacha Membre
    23:52 modifié #2
    dans 1183577462:

    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.

    La méthode size de NSAttributedString ne convient pas pour ce problème ?

    +
    Chacha
  • Eddy58Eddy58 Membre
    23:52 modifié #3
    J'essaierais en utilisant une NSAttributedString configurée avec la string et la fonte du textfield et en utilisant la méthode - (NSRect)boundingRectWithSize:(NSSize)size options:(NSStringDrawingOptions)options de NSAttributedString Application Kit Additions :o
  • MalaMala Membre, Modérateur
    23:52 modifié #4
    Non Chacha, size ne prend pas en compte les retours à  la ligne provoqué par la largeur du NSTextField.

    Je vais regarder de plus près la doc sur boundingRectWithSize que propose Eddy. Je ne connaissais pas cette méthode.
  • syncsync Membre
    23:52 modifié #5
    J'avais trouvé ça pour redimensionner automatiquement un nstokenfield ça marche la même chose pour un nstextfield:

    Dans IB le token est un delegate de l'object qui controlle le nib.

    .h<br />IBOutlet NSTokenField *tokenField;<br /><br />.m<br />Dans ton awake (suis pas sur que tu en ai besoin)<br />- (void)awakeFromNib<br />{<br />	[[tokenField cell] setWraps:YES];<br />}<br /><br />//make your class delegate of the tokenField and implement the&nbsp; following method<br />- (void)controlTextDidChange:(NSNotification *)aNotification<br />{<br />	[self resizeTokenField];<br />}<br /><br />//This implements the live resizing<br />- (void)resizeTokenField<br />{<br />	NSRect oldTokenFieldFrame = [tokenField frame];<br />	NSSize cellSize= [[tokenField cell] cellSizeForBounds:[tokenField&nbsp; <br />	bounds]];<br />	[tokenField setFrame:NSMakeRect(oldTokenFieldFrame.origin.x, oldTokenFieldFrame.origin.y+ oldTokenFieldFrame.size.height- cellSize.height, oldTokenFieldFrame.size.width, cellSize.height)];<br />}
    

  • MalaMala Membre, Modérateur
    23:52 modifié #6
    dans 1183581030:

    J'essaierais en utilisant une NSAttributedString configurée avec la string et la fonte du textfield et en utilisant la méthode - (NSRect)boundingRectWithSize:(NSSize)size options:(NSStringDrawingOptions)options de NSAttributedString Application Kit Additions :o

    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:

    <br />- (float)heightForText:(NSAttributedString*)text withForcedWidth:(float)width<br />{<br />&nbsp; &nbsp; float height = 0;<br />&nbsp; &nbsp; <br />&nbsp; &nbsp; // Create a tmp NSTextView for vertical autoresize only<br />&nbsp; &nbsp; NSTextView *titleField = [[NSTextView alloc] initWithFrame:NSMakeRect(0,0,width,0)];<br />&nbsp; &nbsp; [[titleField textStorage] setAttributedString:text];<br />&nbsp; &nbsp; [titleField setHorizontallyResizable:NO];<br />&nbsp; &nbsp; <br />&nbsp; &nbsp; // Adjust the size<br />&nbsp; &nbsp; [titleField sizeToFit];<br />&nbsp; &nbsp; <br />&nbsp; &nbsp; // Get the height<br />&nbsp; &nbsp; height = [titleField frame].size.height;<br />&nbsp; &nbsp; <br />&nbsp; &nbsp; [titleField release];<br />&nbsp; &nbsp; <br />&nbsp; &nbsp; return height;<br />}<br />
    


    Ca marche au poil même pour mes NSTextField. :p Cela me semble la solution la plus simple et directement intégrable à  une catégorie en attendant mieux.
  • 23:52 modifié #7
    Si ça peut aider, j'ai ajouté ceci dans une catégorie perso de NSString:

    [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.
Connectez-vous ou Inscrivez-vous pour répondre.