我目前正在使用NSString的drawInRect来显示字体。然后将其上传到OpenGL使用的纹理。
示例:
[String drawInRect:textRect withFont:font lineBreakMode:UILineBreakModeCharacterWrap alignment:UITextAlignmentLeft];
我现在需要的是一种在单击[x,y]时确定字符索引的方法。 所以,如果我传入[0,0],它将返回索引[0]。或者[24,4]将返回5例如。
这样做的一种方法是,如果我可以获取绘制的字形的各个边界框并迭代它们。
或者有更好的方法来绘制允许这种功能的文本吗?
答案 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
以及其新属性(NSLayoutManager
和NSTextContainer
)公开的方法来获取给定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;
}
然后通过走这个数组找到该地点