Create UITextRange from NSRange
ios5, nsrange, objective-c, uitextview
Solution
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];
}
Problem
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.