0

我目前正在使用 NSString 的 drawInRect 来显示字体。然后将其上传到纹理以供 OpenGL 使用。

例子:

[String drawInRect:textRect withFont:font lineBreakMode:UILineBreakModeCharacterWrap     alignment:UITextAlignmentLeft];

我现在需要的是一种方法来确定单击 [x,y] 时字符的索引。因此,如果我传入 [0,0],它将返回索引 [0]。或者 [24,4] 将返回 5 例如。

做到这一点的一种方法是,如果我可以绘制字形的各个边界框并遍历它们。

或者有没有更好的方法来绘制允许这种功能的文本?

4

2 回答 2

2

使用 NSString 和 NSAttributedString 绘图方法无法做到这一点。我推荐三种制作可点击文本的方法之一:

1) Core Text PRO:速度很快,适用于旧版本的 iOS。CON:它有很多样板。您必须创建非常冗长的文本属性的 NSDictionaries 以在创建属性字符串时使用,然后在drawRect:实现中使用这些属性字符串来创建CTFrameSettervia CTFramesetterCreateWithAttributedString(),然后使用 frame-setter 创建 a CTFrame,然后使用CTFrame来绘制您的文本。哇!毕竟,您可以查询CTFrame(通过更复杂的代码)以在给定的CGPoint. 所有这一切都不是微不足道的设置。

2)TextKit PRO:它比Core Text容易得多。缺点:它只在 iOS 7 上可用。你可以使用UITextView,连同它的新属性(anNSLayoutManagerNSTextContainer)公开的方法,来获取给定 CGPoint 的字符串信息。

3)使用TTTAttributedLabelPRO:这是最简单的,适用于旧版本的 iOS。缺点:它可能无法提供您需要的功能。

于 2013-09-18T19:01:38.710 回答
0

建议您使用:

NSUInteger count = [string length];
CGFloat widths[length];
for(int i=0; i<count; ++i) {
  widths[i] = [string sizeWithFont:font forWidth:10000 lineBreakMode: UILineBreakModeWordWrap].width;
}

然后通过遍历这个数组找到位置

于 2012-08-22T12:49:55.660 回答