【问题标题】:Hit-testing text in Cocoa (Mac)?可可(Mac)中的命中测试文本?
【发布时间】:2011-08-13 12:08:33
【问题描述】:

有没有办法对文本进行命中测试?例如,如果我在屏幕上的边界框内绘制文本“Hello graph!”,我如何知道这些空白矩形(空格)的尺寸和位置:

  • 字母“e”上方的空白矩形
  • 从字母“o”上方到字母“p”上方的空白矩形
  • 字母“H”下方直到“g”之前空格的空白矩形

等等,你懂的。

换句话说,如何找出实际文本占用的区域以及真正空白的区域。

平台(图形库)是 Mac OS X 上的 Cocoa,字符集是 Unicode(这可能排除了原始 CoreGraphics API?),字体可以是 Cocoa 可以使用的任何东西。

提前致谢

【问题讨论】:

  • 或者从另一个角度看,得到一个区域列表(矩形),它最小地包围了文本。

标签: cocoa macos graphics core-graphics text-rendering


【解决方案1】:

您可以像这样在NSTextView 中获取字符的矩形:

//Get the range of characters, which may be different than the range of glyphs
NSRange range = [[textView layoutManager]glyphRangeForCharacterRange:NSMakeRange(charIndex, 0) actualCharacterRange:NULL]

//Get the rect of the character
NSRect rect = [[textView layoutManager]boundingRectForGlyphRange:range inTextContainer:[textView textContainer]];

然后,得到你想要的NSGlyph:

NSGlyph glyph = [[textView layoutManager]glyphAtIndex:range.location];

并将其绘制在NSBezierPath:

NSBezierPath *path = [NSBezierPath bezierPath];
[path appendBezierPathWithGlyph:glyph inFont:myFavoriteFont];

接下来,查询路径的边界:

NSRect actualRect = [path bounds];

然后您可以比较这两个矩形。

看看NSLayoutManager Class Reference、Text System Overview和Text Layout Programming Guide。

【讨论】:

  • 这将解决方案限制为仅在文本视图中。或者在退化的情况下,为要命中测试的每一段文本创建一个不可见的文本视图(在处理大量文本时可能无法扩展)。
  • 您可以尝试退出第一步,然后尝试在NSBezierPath 中绘制字形。
【解决方案2】:

您可以在完全透明的位图上绘制文本(通过CGBitmapContext),然后检查该位图是否特定点是透明的。

如果您需要一个矩形列表(在 2d 图形中称为 region),您必须自己实现它或通过 Google 搜索库,因为 CoreGraphics 和 Cocoa 没有区域(至少记录在案)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-04
    • 2023-03-27
    • 1970-01-01
    • 2019-03-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多