Sir*_*ens 15 iphone syntax-highlighting objective-c uitextview ios
我问了一个开发人员(Codea的创建者TwoLivesLeft)他们如何在他们的应用程序中进行语法突出显示.他回答 :
@ TD2 Codea编辑器是使用UITextView实现的.突出显示是通过在适当的位置叠加子视图来完成的 - 通常是UILabels.它们从重用池中出列,类似于UITableViewCells的工作方式.在滚动期间,需要重新突出显示从池中拉出标记的线和已移出屏幕的线将其标记转储回池中.
任何人都可以解释我如何获得某个单词的x和y?
bdd*_*ken 37
UITextView符合UITextInput,其中可以在此处找到详细说明.
查看所需的方法"textRangeFromPosition:toPosition:","positionFromPosition:offset:","positionFromPosition:inDirection:offset:",以及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];
Run Code Online (Sandbox Code Playgroud)
运行此代码的结果:

@ bddicken的/sf/answers/804098781/就像一个魅力.但问题是,如果文本包含换行符"\n",它在iOS 7+上不起作用.经过大量的搜索,我找到了解决方案.
在调用firstRectForRange:之前,您必须确保textView的布局
[textView.layoutManager ensureLayoutForTextContainer:textView.textContainer];
Run Code Online (Sandbox Code Playgroud)
礼貌:当混合中出现新行字符时,UITextView firstRectForRange无效
PS:起初我把这个作为评论添加到@ bddicken的答案中.由于大多数人不读评论我添加了这个作为答案.