我正在开发 MacOs 应用程序,由于自定义界面,我必须实现自己的搜索功能。
所以问题是 - 如何在 NSTextView 中的 NSAttributedString 的一部分周围绘制边框以显示搜索结果(就像在 TextEdit 应用程序中完成的那样)。请在所附图片上检查所需的外观:
[更新]
由于自定义界面要求,我无法使用 NSTextViews 的 setUsesFindBar:
和 setUsesFindPanel:
。该界面有一个自定义的 NSSearchField,它应该在 textView 中执行搜索。
我已经熟悉了 performTextFinderAction:
,但是如何在具有 NSSearchField 值的 textView 上触发它?
最佳答案
对于您想做的事情,您不需要使用 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];
这在查找机制中使用,但它也可以在不使用任何查找过程的情况下工作。
关于macos - 在 NSAttributedString 的一部分周围绘制边框,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14607551/