在NSAttributedString的一部分周围绘制边框

时间:2013-01-30 15:27:55

标签: macos cocoa draw core-text nsattributedstring

我正在开发一个MacOs应用程序,由于自定义界面,我必须实现自己的搜索功能。

所以问题是 - 如何在NSTextView中围绕NSAttributedString的一部分绘制边框以显示搜索结果(在TextEdit应用程序中如何完成)。请在附图上查看所需的外观:

http://d.pr/i/w8wP

[UPDATE]

由于自定义界面要求,我无法使用NSTextViews的setUsesFindBar:setUsesFindPanel:。该接口有一个自定义NSSearchField,它应该在textView中执行搜索。

我熟悉performTextFinderAction:,但如何在带有NSSearchField值的textView上触发它呢?

2 个答案:

答案 0 :(得分:2)

对于您想要做的事情,您不需要使用IB或任何查找操作,因为NSTextView对象(假设其名称为myTextView)可以完成所有操作。您必须先创建一个要突出显示的字符范围,然后告诉myTextView执行此操作:

NSRange charRange = NSMakeRange( location length );   // whatever you want
[myTextView showFindIndicatorForRange:charRange];

如果选择在NSScrollView范围内,则此选择应该可见。在致电-showFindIndicatorForRange之前执行此操作(请参阅NSTextView下的文档):

NSLayoutManager *layout = [myTextView layoutManager];
NSRect rect = [layout boundingRectForGlyphRange:charRange
                                inTextContainer:[myTextView textContainer] ];
[myTextView scrollRectToVisible:rect];

现在是一个扩展,可以根据需要显示多个突出显示的字符串。让我们假设我们想要在素数位置标记所有字符。 (我不知道那会有什么好处,但为什么不呢?)。我们创建一个具有相应范围的NSArray :( 伪代码!,范围必须是NSValues!)

allRanges = { (1,1) (2,1) (3,1) (5,1) (7,1) etc.}

现在可以一起选择所有:

[myTextView setSelectedRanges:allRanges];
// select the 3th (zero based) entry
[showFindIndicatorForRange:[allRanges objectAtIndex:3];

这在查找机制中使用,但它也可以不使用任何查找过程。

答案 1 :(得分:0)

在界面构建器中,您可以设置“查找”属性以控制显示内置查找/替换栏的位置。要在代码中执行查找操作,请在NSTextView上调用performFindPanelAction: