使NSTextView完全适合其内容

时间:2010-11-04 16:50:16

标签: objective-c cocoa nsview nstextview

我有一个包含按钮和textview的视图。单击该按钮时,textview的隐藏状态将更改并显示在视图上。已配置弹簧和支柱,因此textview与视图垂直扩展。所有这些都在IB中完成

然后我以编程方式将文本插入textview,但我需要textview显示其所有内容,而无需用户滚动。

这是我用来计算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;    
}

无论是否在textview上调用-sizeToFit,它都会太大或太小(取决于其内容)。

我需要获取textview的高度,并显示所有内容,以便我可以调整视图的大小。

我知道我可能会使用NSTextField作为标签,但我需要一个NSTextView来增加其功能(特别是使用封闭的scrollview的标尺视图)。

有人有任何建议吗?

3 个答案:

答案 0 :(得分:2)

如果字符串超出容器宽度,NSTextView通常会自行调整大小。我认为这是因为包含的单元格具有文本溢出的默认行为,称为“换行”或其他内容。我的直觉是你可以在TextView加载后询问TextView的高度,并相应地调整包含视图,所有这些都不需要布局管理器。并且显然确保自动调整大小的掩码已设置(哦,你在IB中这样做,所以不用担心)。我错了,我没有做任何测试......但是,你可以尝试一下! :P

答案 1 :(得分:1)

她是我如何做到的,效果很好:

// 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只是helpText的一个容器,可以在文本周围添加一些游戏。 helpText使用其容器调整大小。

很明显,对于正确的高度,固定宽度是必要的,因为高度取决于线上的适合度。

答案 2 :(得分:-1)

如果要完全省略滚动视图(例如,创建一个附加到另一个超级视图的文本视图并调整其大小以适合其文本),您可以查看NSText。它是AFAICT,基本上是没有superview(滚动视图部分)的NSTextView,并且可以自动调整自身大小。