保存和恢复NSTextView的位置

时间:2013-04-11 18:48:14

标签: scroll nstextview nslayoutmanager

我希望能够保存NSTextView的当前文本和可见区域并将其还原。使用visibleRect和scrollRectToVisible:似乎会产生不一致的结果。如果我这样做:

- (void)restorePosition
{
    NSRect r = [self.textView visibleRect];

    [self.textView.layoutManager replaceTextStorage: self.textView.textStorage];
    [self.textView scrollRectToVisible: r];
}

当视图位于距离顶部少于85行的位置时,视图将保持在适当的位置,但是越往下走越远。在距离顶部200行处,它最终在277处,在300处,最终在408处等。

如果没有replaceTextStorage,它也会按预期工作,但替换文本并找到上一个位置就是重点。关于替换文本的事情导致线矩形计算变得不稳定。

显然我打算从真实应用中的已保存对象中获取新的visibleRect和textStorage,但这说明了最小代码的问题。

有什么想法吗?

1 个答案:

答案 0 :(得分:1)

我遇到了与恢复滚动位置相关的类似问题。对我来说,解决方案是在更改可见的rect之前强制文本视图进行布局:

[textView.layoutManager ensureLayoutForTextContainer:textView.textContainer];