iPhone CoreText:查找子字符串的像素坐标

jtr*_*rim 10 iphone substring nsattributedstring core-text ios4

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

我想要做的是在NSAttributedString中的子字符串顶部放置一个浮动弹出窗口,该字符串可以跨越多行.NSAttributedString是项目的要求.

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

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

小智 8

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

CTFramesetterRef framesetter = CTFramesetterCreateWithAttributedString(attrString);
CTFrameRef ctframe = CTFramesetterCreateFrame(framesetter, CFRangeMake(0, 0), path, NULL);
Run Code Online (Sandbox Code Playgroud)

现在你将不得不通过框架寻找相关的文本块.获取CTLineRefs 的数组CTFrameGetLines().

遍历数组,测试触摸是否在该行上,通过检查它是否在返回的矩形内CTLineGetImageBounds().如果是,现在通过行中的字形运行.

同样,你可以得到一个CTRunRefs 数组CTLineGetGlyphRuns().检查点击是否在字形运行中CTRunGetImageBounds(),如果是,您可以找到字形运行对应的原始属性字符串中的索引范围CTRunGetStringIndices().