Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Create UITextRange from NSRange

I need to find the pixel-frame for different ranges in a textview. I'm using the - (CGRect)firstRectForRange:(UITextRange *)range; to do it. However I can't find out how to actually create a UITextRange.

Basically this is what I'm looking for:

- (CGRect)frameOfTextRange:(NSRange)range inTextView:(UITextView *)textView {      UITextRange*range2 = [UITextRange rangeWithNSRange:range]; //DOES NOT EXIST      CGRect rect = [textView firstRectForRange:range2];     return rect; } 

Apple says one has to subclass UITextRange and UITextPosition in order to adopt the UITextInput protocol. I don't do that, but I tried anyway, following the doc's example code and passing the subclass to firstRectForRange which resulted in crashing.

If there is a easier way of adding different colored UILables to a textview, please tell me. I have tried using UIWebView with content editable set to TRUE, but I'm not fond of communicating with JS, and coloring is the only thing I need.

Thanks in advance.

like image 538
Johannes Lund Avatar asked Feb 03 '12 09:02

Johannes Lund


1 Answers

You can create a text range with the method textRangeFromPosition:toPosition. This method requires two positions, so you need to compute the positions for the start and the end of your range. That is done with the method positionFromPosition:offset, which returns a position from another position and a character offset.

- (CGRect)frameOfTextRange:(NSRange)range inTextView:(UITextView *)textView {     UITextPosition *beginning = textView.beginningOfDocument;     UITextPosition *start = [textView positionFromPosition:beginning offset:range.location];     UITextPosition *end = [textView positionFromPosition:start offset:range.length];     UITextRange *textRange = [textView textRangeFromPosition:start toPosition:end];     CGRect rect = [textView firstRectForRange:textRange];     return [textView convertRect:rect fromView:textView.textInputView]; } 
like image 134
Nicolas Bachschmidt Avatar answered Sep 22 '22 03:09

Nicolas Bachschmidt