【问题标题】:iPhone CoreText: Find the pixel coordinates of a substringiPhone CoreText:查找子字符串的像素坐标
【发布时间】:2011-04-17 07:19:23
【问题描述】:

这是推特应用的截图供参考:http://screencast.com/t/YmFmYmI4M

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

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

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

【问题讨论】:

    标签: iphone ios4 substring nsattributedstring core-text


    【解决方案1】:

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

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

    现在您必须在框架中寻找相关的文本块。使用CTFrameGetLines() 获取CTLineRefs 的数组。

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

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

    【讨论】:

      【解决方案2】:

      您需要通过 CTLine 找到 Y,通过 CTRun 宽度和高度找到 X,您可以通过单词和字体本身获得。生病附上我的项目链接,它的代码非常简单,但您可以重新编辑以满足您的需求。希望它有助于欢呼,如果你改进一般逻辑请让我知道 thx。 textViewProject

      【讨论】:

      • 请不要在回答中提问。在此处创建一个新问题和链接。
      • vikingosegundo - 这实际上看起来像是一个有效的答案。感谢乔治的链接!
      【解决方案3】:

      George 提供的链接非常有帮助,让我得到了我想要的东西。但是奇怪的事情发生了。它在 iOS SDK 4.0 中工作,但在 iOS SDK 5 中,链接的位置出现在视图上的错误位置。

      所以我不得不稍微调整一下代码。对于可触摸按钮的 x 坐标,我必须使用 CTRunGetTypographicBounds 而不是 CTRunGetImageBounds 函数。

      总的来说,在调整后的代码中: y 坐标、宽度和高度是使用 CTRunGetImageBounds 计算的。 并且 x 坐标是使用 CTRunGetTypographicBounds 计算的。

      【讨论】:

        【解决方案4】:

        我一直在研究一个可以做到这一点的小型图书馆。你可以在这里找到它:https://github.com/pothibo/CMFramework

        但是,这个库处于 alpha 阶段,需要优化并且缺少一些功能(行高是我要添加的紧急功能之一)

        如果您决定使用它并发现问题,请不要犹豫在 github 上发布问题!

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-11-01
          • 2013-04-29
          • 1970-01-01
          • 1970-01-01
          • 2012-09-07
          • 1970-01-01
          相关资源
          最近更新 更多