这是供引用的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/