我已通过正确设置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
位置开始跳转(滚动旋钮变为到了附近的一些随机位置
造成这种情况的原因是什么?
答案 0 :(得分:11)
我终于从我的观察中发现,跳跃不仅发生在按空格键时,也发生在其他键(如退格键)上,这恰好发生在两者都发生时。
- 打开非连续布局
- 可见区域之前的文本的任何修改,甚至是属性,都在-textStorageDidProcessEditing:
内进行
看起来它是非连续布局功能中的错误!如果专家能够确认,那将会很好
它似乎与调用-beginEditing
和-endEditing
无关。
答案 1 :(得分:6)
埃里克。 我不知道你是否解决了这个问题。但是,我遇到了类似的问题,我发现关闭NSTextView的XCode 4.x属性检查器中关闭“非连续布局”选项将解决问题。 NSLayoutManager的文档提供了更多线索(在“概述”部分下):“非连续布局是Mac OS X v10.5中新增的可选布局管理器行为......”。
在我的情况下,我遇到了这种行为,无论是使用委托方法还是通过通知调用的中间方法,只有当文本存储内容变得大于封闭的文本视图时才会发生,导致滚动处于活动状态并“推送”文本视图到顶部。关闭选项后,不再观察到“跳跃”。 希望能帮助到你。 汤姆
答案 2 :(得分:2)
原来在-beginEditing
函数中调用-endEditing
和-textStorageDidProcessEditing:
并不是很健康!我转而使用了NSTextView
s -didChangeText
。
答案 3 :(得分:2)
为什么不删除-beginEditing
和-endEditing
来电?我刚才有同样的问题,这解决了我的问题。
答案 4 :(得分:0)
textView.layoutManager?.allowsNonContiguousLayout = false
解决了我的问题