保存和恢复 NSTextView 的位置

Mat*_*att 7 scroll nslayoutmanager nstextview

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

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

    [self.textView.layoutManager replaceTextStorage: self.textView.textStorage];
    [self.textView scrollRectToVisible: r];
}
Run Code Online (Sandbox Code Playgroud)

当视图距离顶部不到 85 行时,视图将保持在原位,但我走得越远,它就会变得越远。从顶部开始 200 行,最终为 277,在 300 行,最终为 408,依此类推。

如果没有replaceTextStorage,它也可以按预期工作,但替换文本并找到以前的位置才是重点。替换文本的某些问题会导致线矩形计算变得不稳定。

显然,我计划从实际应用程序中保存的对象获取新的visibleRect和textStorage,但这说明了最少代码的问题。

有任何想法吗?

Ada*_*ble 4

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

[textView.layoutManager ensureLayoutForTextContainer:textView.textContainer];
Run Code Online (Sandbox Code Playgroud)