增长NSTextView以适应内容是剪切最后一行文本

时间:2013-06-28 19:40:32

标签: objective-c cocoa nstextview nsscrollview

我正在尝试创建一个NSTextView,当用户键入并在高度达到最大值时滚动,它会垂直增长。这类似于Messages works中的文本视图。

我的第一次尝试使用委托来监听文本更改并调整与NSTextView的滚动视图关联的高度约束:

- (void)textDidChange:(NSNotification *)notification
{
    NSTextView *textView = self.textView;
    NSRect usedRect = [textView.textContainer.layoutManager usedRectForTextContainer:textView.textContainer];
    NSLog(@"DEBUG: used rect: %@", NSStringFromRect(usedRect));
    self.textViewHeightConstraint.constant = MIN(80.f, MAX(usedRect.size.height, 30.f));
}

这几乎可行:文本视图(滚动视图)的高度在我输入时更新,但最后一行文字被剪裁:

enter image description here

滚动视图达到最大高度并开始滚动后效果很好。我试图在封闭的滚动视图上强制显示/布局/约束更新,没有运气。我的猜测是滚动视图的剪辑视图没有正确更新,它正在剪切文本视图的底部。当约束发生变化时,有没有办法强制剪辑视图/滚动视图适当更新?

2 个答案:

答案 0 :(得分:0)

我不确定它是否有用,但是我编写了一个垂直扩展的NSTextView子类,它是available on GitHub。您可以随意查看或调整。

答案 1 :(得分:0)

我相信您将NSTextView的高度设置为textContainer所需的大小,但您不会考虑文本视图添加的插入内容。尝试将-[NSTextView textContainerInset]的高度添加到您计算的高度。

文档并未真正指定,但我假设textContainerInset返回所有方面的宽度/高度的总插入内容,-[NSTextView textContainerOrigin]将大致分成两半