开发者

Getting NSTextView to perfectly fit its contents

开发者 https://www.devze.com 2023-01-23 07:15 出处:网络
I have a view that contains a button and a textview. When the button is clicked, the textview\'s hidden status will change and be shown on the view. Springs and struts have been configured so the text

I have a view that contains a button and a textview. When the button is clicked, the textview's hidden status will change and be shown on the view. Springs and struts have been configured so the textview expands vertically with the view. All this is done in IB

I then insert text into the textview programmatically, but I need the textview to show all its contents without the user needing to scroll.

This is the code I use to calculate the height of the text in the textview:

- (float) getTextViewHeight {

    //based on http://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/TextLayout/Tasks/StringHeight.html%23//apple_ref/doc/uid/20001809-CJBGBIBB

    [textview.textContainer setLineFragmentPadding:0.0];
    [textview.layoutManager glyphRangeForTextContainer:textview.textContainer]; 

    return [textview.layoutManager usedRectForTextContainer:self.interactionData.textContainer].size.height;    
}

With or without that call to -sizeToFit on the textview, it will either be too big or too small (depending on its contents).

I need to get the height of the textview开发者_开发百科 with all the contents showing so I can adjust the view's size.

I know I could probably use a NSTextField as a label, but I need a NSTextView for its added functionality (specifically using the enclosing scrollview's rulerview).

Does anybody have any suggestions?


NSTextView generally will resize itself if its string over-runs the container width. I think this is because the contained cell has a default behavior for text over-run, called "Line Wrap" or something. My gut feeling is you could just ask the TextView for it's height after it's been loaded and adjust the containing view accordingly, all without needing a layout manager. And obviously make sure the auto-resizing mask is set (oh, you're doing this in IB so no worries there). I could be wrong, and I didn't do any tests... but yeah, you could try it! :P


Her's how I do it and it works well:

// Help text.
NSBundle* mainBundle = [NSBundle mainBundle];
NSString* path = [mainBundle pathForResource: @"category-analysis-help" ofType: @"rtf"];
NSAttributedString* text = [[NSAttributedString alloc] initWithPath: path documentAttributes: NULL];
[helpText setAttributedStringValue: text];
NSRect bounds = [text boundingRectWithSize: NSMakeSize(helpText.bounds.size.width, 0) options: NSStringDrawingUsesLineFragmentOrigin];
helpContentView.frame = NSMakeRect(0, 0, helpText.bounds.size.width + 20, bounds.size.height + 20);

helpContentView is just a container for helpText to add some marging around the text. helpText resizes with its container.

It should be obvious that for the correct height a fixed width is necessary, since the height depends on what fits on the lines.


If you want to omit the scroll view entirely (e.g., make a text view that is attached to another superview and sizes itself to fit its text), you might take a look at NSText. It is, AFAICT, basically a NSTextView without the superview (scroll view parts), and can automagically resize itself.

0

精彩评论

暂无评论...
验证码 换一张
取 消