调整NSTextView大小以适应内容,但最后一行文本被裁剪

6

我想创建一个NSTextView,在用户输入时垂直增长并在高度达到最大值后滚动。这类似于"消息"中的文本视图。

我的第一次尝试是使用委托来监听文本更改,并调整与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

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

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


0

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


谢谢 - 我在文本视图的父视图中使用自动布局(并依赖它),所以我不确定能否使用您的可扩展文本视图。但希望这能指引我正确的方向。 - ppilone
你是怎么让你的代码工作的?我在一个类似聊天界面的应用中使用它(将文本显示在底部的TextView),但它不起作用。和上面的问题一样。 - KVISH
我刚重新检查了我的代码(3年后...),我觉得我已经用AutoLayout使其正常工作了。我将在一秒钟内将我的更改提交到GitHub。 - Seb Jachec

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接