2009-11-22 72 views

回答

6

对于NSTextField,请注意,它是执行绘制的NSTextFieldCell。你会想重写-drawInteriorWithFrame:inView:并且自己做字符串绘制。面临的挑战将是找到你的子串被绘制的矩形(如果范围被包装,则有多个)。你最终不得不使用NSLayoutManager和一个NSTextStorage容器。

最好使用NSTextView。关联的NSLayoutManager和NSTextStorage组件已经预先组装好了,您可以免费获得许多其他功能。最重要的是,有一个方便的方法 - [NSTextView drawViewBackgroundInRect:]方法,因此您不必子类化任何东西。你只需要问文本视图的布局管理器和文本存储,然后问它给定范围的矩形。有关更多详细信息,请参阅Text System Overview和链接的文档。

要有效查找有趣的子字符串,可以使用custom attributes(或内置的字符,例如NSLinkAttributeName)作为您感兴趣的范围。

+0

如果你想围绕文本系统进行打包,你可能会比开始使用Aaron Hillegass的这段视频谈论它更糟糕:http://vimeo.com/4793853 – 2009-11-22 13:36:56

+0

一个简单的代码示例会很棒! :) – papr 2009-11-23 20:48:57

+0

它会的,不是吗? :-)不幸的是,这不是可以减少到StackOverflow友好长度的东西。有一些例子可以漂浮 - 尝试cocoadev.com和通常的友好搜索引擎。关键字提示:NSLayoutManager,字形范围,nstextview drawBackgroundInRect:... – 2009-11-23 22:29:13

0

另一种考虑是可编辑的WebView,您可以在其中使用CSS构建自定义属性。

+1

这确实需要找到给定的范围和自定义绘图的rects,但它对我来说似乎有点沉重。如果使用自定义属性,则还需要花费更多的精力将属性(本例中为标记)分配到所需的范围。根据OP的目标,“最好的”可能无论如何,但两边都有很多缺点。 – 2009-11-22 14:45:55

+0

(超出房间范围。)为自定义属性指定跨度相对比较容易,但是多种类型的自定义属性现在需要区分跨度类等。这是一个额外的层。此外,它需要更多的努力(IMO)在文档中定位和操作这个标记,而不是Cocoa文本系统。 – 2009-11-22 14:48:21