【问题标题】:Saving and restoring NSTextView's position保存和恢复 NSTextView 的位置
【发布时间】: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


【解决方案1】:

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

[textView.layoutManager ensureLayoutForTextContainer:textView.textContainer];

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-09-10
    • 1970-01-01
    • 1970-01-01
    • 2011-06-02
    • 2012-01-12
    • 2011-11-02
    • 2011-11-19
    • 1970-01-01
    相关资源
    最近更新 更多