保存和恢复NSTextView的位置

问题描述:

我希望能够保存NSTextView的当前文本和可见区域并将其恢复。使用visibleRect和scrollRectToVisible:似乎会传递不一致的结果。如果我只是做:保存和恢复NSTextView的位置

- (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

我已经发现,使用'NSLayoutManager *的layoutManager = myTextView.layoutManager; NSRange glyphRange = [layoutManager glyphRangeForBoundingRect:[self.textView visibleRect] inTextContainer:self.textView.textContainer]; NSRange charRange = [layoutManager characterRangeForGlyphRange:glyphRange actualGlyphRange:&glyphRange];' 保存位置和'[myTextView scrollRangeToVisible:charRange];'几乎可以恢复工作。它可以被一行关闭,但比scrollRectToVisible:do好得多。 – Matt 2013-04-12 16:10:36

我有一个类似的问题,涉及恢复滚动位置。对我来说,解决办法是改变可见矩形前强制文本视图布局:

[textView.layoutManager ensureLayoutForTextContainer:textView.textContainer];