我问一个开发商(TwoLivesLeft,CODEa所的创建者)他们是如何做语法高亮显示在他们的应用程序。 他回答 :
@ TD2的CODEa所编辑器使用一个UITextView实现。 通常UILabels - 高亮显示被叠加在适当位置做子视图。 他们是从再利用水池,类似的方式UITableViewCells工作离队。 在滚动时,将线路需要重新凸显拉标记出池和线已移出屏幕抛售他们的标记放回池中的。
任何人都可以解释我是如何会得到一定的单词的x和y?
我问一个开发商(TwoLivesLeft,CODEa所的创建者)他们是如何做语法高亮显示在他们的应用程序。 他回答 :
@ TD2的CODEa所编辑器使用一个UITextView实现。 通常UILabels - 高亮显示被叠加在适当位置做子视图。 他们是从再利用水池,类似的方式UITableViewCells工作离队。 在滚动时,将线路需要重新凸显拉标记出池和线已移出屏幕抛售他们的标记放回池中的。
任何人都可以解释我是如何会得到一定的单词的x和y?
UITextView的符合UITextInput,其中的详细描述,可以发现在这里 。
看看所需的方法“textRangeFromPosition:toPosition:”,“positionFromPosition:偏移”,“positionFromPosition:间接:偏移”,和一些在UITextInput协议的其他基于几何的方法。 这些可能会提供你正在寻找的功能。
我还没有真正尝试过,以确保这些工作,你希望他们过的方式,但看起来像它你需要什么。
让我知道如果你需要更多的帮助!
更新:
这里是如何做到这一点一些示例代码。 我最终得到了“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就像一个魅力。 但问题是,它不会在iOS工作7+如果文本包含一个换行符“\ n”。 很多搜索后,我发现应该是一个解决方案。
你必须确保在调用firstRectForRange之前的TextView的布局:通过
[textView.layoutManager ensureLayoutForTextContainer:textView.textContainer];
礼貌: UITextView的firstRectForRange不工作时,有在混合换行符
PS:首先我将此作为@ bddicken的答案评论。 由于大多数人不读的评论我将此作为一个答案。