Я пытаюсь добиться визуального эффекта с помощью UITextView
, при котором текст имеет отдельный цвет фона, например:
Подход, который я пытался использовать, был основан на фрагменте кода Apple, используемом для расчета строк, а затем построен на основе, как показано на этом пример для расчета рамок строк, например:
NSLayoutManager *layoutManager = [textView layoutManager];
NSString *string = textView.text;
NSInteger numberOfLines, index, stringLength = [string length];
NSMutableArray *ranges = [[NSMutableArray alloc] init];
NSMutableArray *frames = [[NSMutableArray alloc] init];
for (index = 0, numberOfLines = 0; index < stringLength; numberOfLines++)
{
NSRange tempRange;
NSRange range = [string lineRangeForRange:NSMakeRange(index, 0)];
CGRect rect = [layoutManager lineFragmentRectForGlyphAtIndex:index
effectiveRange:&tempRange];
[ranges addObject:[NSValue valueWithRange:range]];
[frames addObject:[NSValue valueWithCGRect:rect]];
NSMaxRange(tempRange);
}
Затем я беру рамки и рисую прямоугольники. Этот и подобные подходы, которые я пробовал, имеют общую проблему: кадры строк, которые я вычисляю, содержат конечные пробелы, и я не уверен, как их обрезать (а также поддерживать правильный поток текста).
Я беспокоюсь, что могу слишком много думать об этом. Есть ли более простой способ?
index
остается нетронутым, а возвращаемое значениеNSMaxRange
не используется. Однако вы получаете диапазон глифов макета вtempRange
. Просто взгляните на строку, если есть пробелы, удалите их и перекомпонуйте (частичную) строку. (Кстати: глифы и символы не обязательно имеют отношение 1 к 1.) - person Amin Negm-Awad   schedule 20.01.2017