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

标签 macos cocoa draw core-text nsattributedstring

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

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

http://d.pr/i/w8wP

[更新]

由于自定义界面要求,我无法使用 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/

相关文章:

python - 为什么我不能使用 Python 脚本中的 Cocoa 类?

opengl - 在OpenGL中绘制字符串

ios - 在 Mac 上通过 USB 访问 iOS 设备

python - 如何使用 Homebrew 软件在 macOS 中安装以前版本的 Python 3?

objective-c - 从 cocoa (obj.c) 执行 shell 脚本并响应

java - 代码无法正确重绘

带有PorterDuff.Mode.DST_IN的android drawBitmap,应该透明的区域变成黑色

c++ - 真的有类似 Objective C++ 的东西吗?

macos - 如何在 mac osx 上强制 docker push

iphone - 如果 NSString stringWithContentsOfFile 已被弃用,那么它的替代品是什么?