Scroll 保存和恢复NSTextView';s位置

Scroll 保存和恢复NSTextView';s位置,scroll,nstextview,nslayoutmanager,Scroll,Nstextview,Nslayoutmanager,我希望能够保存NSTextView的当前文本和可见区域,并将其还原。使用visibleRect和scrollRectToVisible:似乎会产生不一致的结果。如果我这样做: - (void)restorePosition { NSRect r = [self.textView visibleRect]; [self.textView.layoutManager replaceTextStorage: self.textView.textStorage]; [self.

我希望能够保存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,但这说明了代码最少的问题


有什么想法吗?

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

[textView.layoutManager ensureLayoutForTextContainer:textView.textContainer];

我发现使用
NSLayoutManager*layoutManager=myTextView.layoutManager;NSRange glyphRange=[layoutManager glyphRangeForBoundingRect:[self.textView visibleRect]inTextContainer:self.textView.textContainer];NSRange charRange=[layoutManager characterRangeForGlyphRange:glyphRange实际glyphRange:&glyphRange]保存位置和“[myTextView scrollRangeToVisible:charRange];”恢复几乎正常工作。它可以通过一行关闭,但这比scrollRectToVisible:好得多。