6

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

我的第一次尝试使用委托来监听文本变化并调整与 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));
}

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

在此处输入图像描述

一旦滚动视图达到它的最大高度并开始滚动它就可以很好地工作。我尝试在封闭的滚动视图上强制显示/布局/约束更新,但没有成功。我的猜测是滚动视图的剪辑视图没有正确更新,它正在剪辑文本视图的底部。当约束发生变化时,有什么方法可以强制剪辑视图/滚动视图适当更新?

4

2 回答 2

0

我不确定它是否有用,但我写了一个垂直扩展的 NSTextView 子类,它可以在 GitHub 上找到。随意查看或根据需要进行调整。

于 2013-06-28T21:06:06.403 回答
0

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

文档并没有真正指定,但我假设textContainerInset返回所有边的宽度/高度的总插图,-[NSTextView textContainerOrigin]并且大致将其分成两半。

于 2014-04-07T21:35:31.940 回答