这是供引用的twitter应用程序的屏幕截图:http://screencast.com/t/YmFmYmI4M

我想做的是将 float 弹出窗口放在NSAttributedString的子字符串顶部,该子字符串可以跨越多行。 NSAttributedString是项目的必需项。

在提供的屏幕截图中,您可以看到链接是背景突出显示的,因此使我相信它们正在使用CoreText和NSAttributedStrings。我还发现了一个名为CTRunRef(http://developer.apple.com/library/ios/#documentation/Carbon/Reference/CTRunRef/Reference/reference.html)的东西,它看起来很有希望,但是我很难在概念上将它们全部组合在一起。

简而言之,如果我在核心文本中有一个段落,当我点击一个单词时,如何找到该单词的边界框?

最佳答案

在属性字符串中设置一些不会影响显示的属性,但会导致它作为单独的字形运行进行布局,然后使用CoreText布局字符串

CTFramesetterRef framesetter = CTFramesetterCreateWithAttributedString(attrString);
CTFrameRef ctframe = CTFramesetterCreateFrame(framesetter, CFRangeMake(0, 0), path, NULL);

现在,您将不得不在框架中搜寻以找到相关的文本块。使用CTLineRef获取CTFrameGetLines()的数组。

遍历数组,通过检查触摸是否在该行上,方法是检查触摸是否在CTLineGetImageBounds()返回的rect中。如果是的话,现在看一下该行中的字形。

同样,您可以使用CTRunRef获得一个CTLineGetGlyphRuns()数组。检查敲击是否在使用CTRunGetImageBounds()运行的字形中,如果是,则可以在使用CTRunGetStringIndices()的字形所对应的原始属性字符串中找到索引范围。

关于iPhone CoreText : Find the pixel coordinates of a substring,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/3796148/

10-11 19:49