获取UITextView中单词的X和Y坐标

我问了一个开发者(CodeLa的创build者TwoLivesLeft),他们在应用程序中是如何进行语法高亮显示的。 他回答 :

@ TD2 Codea编辑器是使用UITextView实现的。 突出显示是通过在适当的位置叠加子视图来完成的 – 通常是UILabels。 他们从重用池中出列,类似于UITableViewCells的工作方式。 在滚动期间,需要重新突出显示的行将标记从池中拉出,并且已经移出屏幕的行将标记转储回池中。

任何人都可以解释我将如何得到某个单词的x和y?

UITextView符合UITextInput,其中的详细描述可以在这里find。

查看所需的方法“textRangeFromPosition:toPosition:”,“positionFromPosition:offset:”,“positionFromPosition:inDirection:offset:”,以及其他一些在UITextInput协议中的基于几何的方法。 这些可能会提供您正在寻找的function。

我其实并没有试图确定这些工作是按照你所希望的方式进行的,但是这看起来像是你需要的。

让我知道你是否需要任何帮助!


更新:

这里是一些如何做到这一点的示例代码。 我结束了“firstRectForRange:”方法的工作。 这段代码基本上把UITextView的“textStuff”的最后三个字母加亮,并将其突出显示为绿色。

UITextView *textStuff = [[UITextView alloc] init]; textStuff.frame = CGRectMake(2.0, 200.0, 200.0, 40.0); textStuff.text = @"how are you today?"; textStuff.textColor = [UIColor blackColor]; UITextPosition *Pos2 = [textStuff positionFromPosition: textStuff.endOfDocument offset: nil]; UITextPosition *Pos1 = [textStuff positionFromPosition: textStuff.endOfDocument offset: -3]; UITextRange *range = [textStuff textRangeFromPosition:Pos1 toPosition:Pos2]; CGRect result1 = [textStuff firstRectForRange:(UITextRange *)range ]; NSLog(@"%f, %f", result1.origin.x, result1.origin.y); UIView *view1 = [[UIView alloc] initWithFrame:result1]; view1.backgroundColor = [UIColor colorWithRed:0.2f green:0.5f blue:0.2f alpha:0.4f]; [textStuff addSubview:view1]; 

运行此代码的结果:

在这里输入图像说明

@ bddicken的https://stackoverflow.com/a/11487125/3549781就像一个魅力。 但问题是,如果文本包含换行符“\ n”,则它不适用于iOS 7或更高版本。 经过大量的search,我find了一个解决scheme。

在调用firstRectForRange:by之前,必须确保textView的布局

 [textView.layoutManager ensureLayoutForTextContainer:textView.textContainer]; 

礼貌: UITextView firstRectForRange混合中有新的行字符时不工作

PS:起初我把这个添加为对@ bddicken的回答的评论。 由于大多数人不读评论我加了这个答案。

Interesting Posts