Построение CGPath вокруг предложений в UITextView невероятно медленно при -positionFromPosition:
Я делаю некоторый анализ текста и столкнулся с раздражающим падением производительности, которое я не могу найти, как оптимизировать. Я начинаю с текста из UITextView и разделяю текст на массив предложений, разбивая их на символы в ".?!".
Затем я перебираю каждое предложение, разбивая предложение на массив слов и вытягивая первое и последнее слово из предложения. Имея NSRange текста предложения в руке, я нахожу диапазон первого и последнего слова в тексте UITextView.
Следующая часть - то, где я прибита с производительными стоками. This is how I find the bounding CGRect of the first and last word:
// the from range is increased each iteration
// so i'm not searching the entirety of the text each pass
NSRange range = [textView.text rangeOfString:firstWord options:kNilOptions range:fromRange];
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];
firstRect = [textView firstRectForRange:textRange];
I perform this twice, once for the first word and once for the last word.
This works well on smaller text, but approaching 5+ paragraphs Instruments tells me that the UITextView -positionFromPosition: operation is eating up 492ms of clock time, locking up the UI and CPU at 100%.
The thing is I need the CGRect surrounding the first and last words so I can build a CGPath to highlight the sentence. The entire thing works and looks really great, but its the hang while the rects are found that is killing me. I'm fairly new to using UITextView's, so if there is something I can do, either optimizing my searches with ranges or somehow placing my operations on a background thread, I'd be much obliged.
1 ответ
Вам будет лучше использовать UITextView
"s attributedText
свойство, которое принимает NSAttributedString
, С этим вы можете установить NSBackgroundColorAttributeName
цвет в определенном диапазоне.
Обратите внимание, что методы атрибуции текста работают только в iOS 6+.