获取使用drawInRect绘制的NSString中x,y位置的字符索引

时间:2012-08-22 09:59:54

标签: ios nsstring

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

示例:

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

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

这样做的一种方法是,如果我可以获取绘制的字形的各个边界框并迭代它们。

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

2 个答案:

答案 0 :(得分:2)

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

1)核心文字 PRO:它很快,适用于旧版本的iOS。 CON:它有很多样板。您必须创建非常冗长的文本属性的NSDictionaries,以便在创建属性字符串时使用,然后在drawRect:实现中使用这些属性字符串通过CTFrameSetter创建CTFramesetterCreateWithAttributedString(),然后使用框架设置器创建CTFrame,然后使用CTFrame绘制文字。呼!毕竟,您可以查询CTFrame(通过更复杂的代码)来查找给定CGPoint处的抽头字符的索引。这一切并非易事。

2) TextKit PRO:它比Core Text容易得多。 CON:它仅在iOS 7上可用。您可以使用UITextView以及其新属性(NSLayoutManagerNSTextContainer)公开的方法来获取给定CGPoint的字符串信息。

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

答案 1 :(得分: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;
}

然后通过走这个数组找到该地点