2010-04-16 5 views
13

J'essaie de définir une chaîne attribuée dans NSTextView. Je veux augmenter sa hauteur en fonction de son contenu, initialement il est défini à une valeur par défaut.Comment redimensionner NSTextView en fonction de son contenu?

J'ai donc essayé cette méthode:

Je mis le contenu en NSTextView. Lorsque nous définissons du contenu dans NSTextView, sa taille augmente automatiquement. J'ai donc augmenté la hauteur de sa vue super qui est NSScrollView à sa hauteur, mais NSScrollView n'est pas complètement redimensionné, il montre scroller à droite.

float xCoordinate = 15.0; 

[xContentViewScroller setFrame:NSMakeRect(xCoordinate, 0.0, 560.0, 10.0)]; 

[[xContentView textStorage] setAttributedString:xContents]; 

float xContentViewScrollerHeight = [xfContentView frame].size.height + 2; 

[xContentViewScroller setFrame:NSMakeRect(xCoordinate, 0.0, 560.0, xContentViewScrollerHeight)]; 

Quelqu'un peut-il me suggérer un moyen ou une méthode pour résoudre ce problème? En faisant la recherche google je trouve que dans UITextView il y a la méthode contentSize qui peut obtenir la taille de son contenu, j'ai essayé de trouver la méthode similaire à NSTextView mais n'a pas pu obtenir aucun succès :(

+0

solution proposée par Peter élaborée [ici] (http://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/TextLayout/Tasks/StringHeight.html) acclamations – Devarshi

Répondre

15
+0

@Peter Hosey - Pouvez-vous expliquer cela plus en détail? J'ai obtenu le rect de layoutmanager .. maintenant que dois-je faire pour augmenter la taille de NSTextView? – Saurabh

+0

@Saurabh: augmente la taille de la vue de texte, ou la vue de défilement qui la contient, ou la vue parente de la vue de défilement, ou de la fenêtre elle-même par la différence entre la taille courante de la vue de texte (ou défilement de la vue, la taille de son rect visible visible) et la taille que le texte prendra réellement. –

+0

Liens @PeterHosey sont morts – Cfr

2
NSTextView *textView = [[NSTextView alloc] init]; 
textView.font = [NSFont systemFontOfSize:[NSFont systemFontSize]]; 
textView.string = @"Lorem ipsum"; 

[textView.layoutManager ensureLayoutForTextContainer:textView.textContainer]; 

textView.frame = [textView.layoutManager usedRectForTextContainer:textView.textContainer]; 
0
+ (float)heightForString:(NSString *)myString font:(NSFont *)myFont andWidth:(float)myWidth andPadding:(float)padding { 
    NSTextStorage *textStorage = [[NSTextStorage alloc] initWithString:myString]; 
    NSTextContainer *textContainer = [[NSTextContainer alloc] initWithContainerSize:NSMakeSize(myWidth, FLT_MAX)]; 
    NSLayoutManager *layoutManager = [[NSLayoutManager alloc] init]; 
    [layoutManager addTextContainer:textContainer]; 
    [textStorage addLayoutManager:layoutManager]; 
    [textStorage addAttribute:NSFontAttributeName value:myFont 
        range:NSMakeRange(0, textStorage.length)]; 
    textContainer.lineFragmentPadding = padding; 

    (void) [layoutManager glyphRangeForTextContainer:textContainer]; 
    return [layoutManager usedRectForTextContainer:textContainer].size.height; 
} 

Je l'ai fait la fonction en utilisant cette référence:.. Documentation

Exemple:

float width = textView.frame.size.width - 2 * textView.textContainerInset.width; 
float proposedHeight = [Utils heightForString:textView.string font:textView.font andWidth:width 
            andPadding:textView.textContainer.lineFragmentPadding];