18

我询问了一位开发人员(TwoLivesLeft,Codea 的创建者)他们是如何在他们的应用程序中进行语法高亮的。他回答 :

@TD2 Codea 编辑器是使用 UITextView 实现的。突出显示是通过在适当的位置覆盖子视图来完成的——通常是 UILabel。它们从重用池中出列,类似于 UITableViewCells 的工作方式。在滚动期间,需要重新突出显示的行将标记拉出池,而已移出屏幕的行会将其标记转回池中。

谁能解释我如何得到某个单词的 x 和 y ?

4

2 回答 2

41

UITextView 符合 UITextInput,详细说明可以看这里

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

我实际上并没有尝试确保这些工作也按照您想要的方式工作,但这看起来就像您需要的那样。

如果您需要更多帮助,请告诉我!


更新:

这是一些有关如何执行此操作的示例代码。我最终得到了“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];

运行此代码的结果:

在此处输入图像描述

于 2012-07-14T20:22:59.990 回答
5

@bddicken 的https://stackoverflow.com/a/11487125/3549781就像一个魅力。但问题是,如果文本包含换行符“\n”,它在 iOS 7+ 上不起作用。经过大量搜索,我找到了解决方案。

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

[textView.layoutManager ensureLayoutForTextContainer:textView.textContainer];

礼貌:当混合中有换行符时,UITextView firstRectForRange 不起作用

PS:起初我将此作为评论添加到@bddicken's answer。由于大多数人不阅读评论,我将其添加为答案。

于 2015-06-10T09:33:34.467 回答