【发布时间】:2013-04-11 18:48:13
【问题描述】:
我希望能够保存 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,但这说明了最少代码的问题。
有什么想法吗?
【问题讨论】:
-
我发现使用
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: 好得多。
标签: scroll nstextview nslayoutmanager