修改NSTextStorage属性会导致滚动视图跳转

时间:2011-03-16 10:17:53

标签: objective-c cocoa macos

我已通过正确设置NSTextStorage的{​​{1}}代理并更改NSTextView中的文字属性,实施了基本的语法突出显示。

基本流程如下

-textStorageDidProcessEditing

当输入- (void)textStorageDidProcessEditing:(NSNotification *)notification { NSTextStorage *storage = [notification object]; [storage beginEditing]; NSString *text = [storage string]; NSRange textRange = NSMakeRange(0, [text length]); [storage removeAttribute:NSForegroundColorAttributeName range:textRange]; // Some regex matching here ... [storage addAttribute:NSForegroundColorAttributeName value:[COSyntax colorForPatternGroup:pattern.groupName] range:capturedRanges[group]]; [storage endEditing]; } 字符时调用-removeAttribute:range:-addAttribute:value:range时,SPACE周围的NSTextView位置开始跳转(滚动旋钮变为到了附近的一些随机位置

造成这种情况的原因是什么?

5 个答案:

答案 0 :(得分:11)

我终于从我的观察中发现,跳跃不仅发生在按空格键时,也发生在其他键(如退格键)上,这恰好发生在两者都发生时。 - 打开非连续布局 - 可见区域之前的文本的任何修改,甚至是属性,都在-textStorageDidProcessEditing:内进行 看起来它是非连续布局功能中的错误!如果专家能够确认,那将会很好 它似乎与调用-beginEditing-endEditing无关。

答案 1 :(得分:6)

埃里克。 我不知道你是否解决了这个问题。但是,我遇到了类似的问题,我发现关闭NSTextView的XCode 4.x属性检查器中关闭“非连续布局”选项将解决问题。 NSLayoutManager的文档提供了更多线索(在“概述”部分下):“非连续布局是Mac OS X v10.5中新增的可选布局管理器行为......”。

Here's the post

在我的情况下,我遇到了这种行为,无论是使用委托方法还是通过通知调用的中间方法,只有当文本存储内容变得大于封闭的文本视图时才会发生,导致滚动处于活动状态并“推送”文本视图到顶部。关闭选项后,不再观察到“跳跃”。 希望能帮助到你。 汤姆

答案 2 :(得分:2)

原来在-beginEditing函数中调用-endEditing-textStorageDidProcessEditing:并不是很健康!我转而使用了NSTextView s -didChangeText

答案 3 :(得分:2)

为什么不删除-beginEditing-endEditing来电?我刚才有同样的问题,这解决了我的问题。

答案 4 :(得分:0)

textView.layoutManager?.allowsNonContiguousLayout = false

解决了我的问题